IntelliJ Python 3 inspection "Expected a dictionary, got a dict" 是 super with **kwargs 的误报吗?

Is IntelliJ Python 3 inspection "Expected a dictionary, got a dict" a false positive for super with **kwargs?

我使用 Python 3 并想用自定义的 class 包装 argparse.ArgumentParser formatter_class=argparse.RawDescriptionHelpFormatter 默认。我可以成功地做到这一点,但是带有 Python 插件 (PyCharm) 的 IntelliJ IDEA 2017.1 对以下代码发出警告:

class CustomParser(argparse.ArgumentParser):
def __init__(self, formatter_class=argparse.RawDescriptionHelpFormatter, **kwargs):
    # noinspection PyArgumentList
    super().__init__(formatter_class=formatter_class, **kwargs)  # warning in this line for the last argument if suppression comment above removed

如果使用 IntelliJ 抑制命令删除评论,则 kwargs 上的警告是 "Expected a dictionary, got a dict",但它正在运行。这是误报警告还是可以在没有警告的情况下做得更好?此警告背后是否存在有助于避免的真正问题?

附带问题:使用
有区别吗 formatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter) 而不是在签名中显式定义命名参数?根据PEP20 签名中越明确越好,对吧?

是的,这似乎是误报。

您问的是 formatter_class=kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)。请不要那样做。作为下一个参数出现的变异 kwargs,看起来很糟糕。此外,默认关键字 args 应该设置为一个简单的常量而不是一些可变的数据结构,因为在导入时评估和在 运行 时评估之间存在很大差异。参见例如http://www.effbot.org/zone/default-values.htm。通常的习惯用法是在签名中 formatter_class=None ,然后在正文中测试 None 并将 kwargs 变异为您的心脏内容。

将存储在项目中的所有虚拟环境目录(例如 ./venv)标记为已排除已用 PyCharm 2020.2.3.

为我解决了这个问题

为此:右键单击项目树中的虚拟环境目录,然后select:Mark Directory as -> Excluded。来自 https://youtrack.jetbrains.com/issue/PY-39715.

的解决方案