【问题标题】:Is IntelliJ Python 3 inspection "Expected a dictionary, got a dict" a false positive for super with **kwargs?IntelliJ Python 3 检查“期望字典,得到字典”是否是带有 **kwargs 的 super 误报?
【发布时间】:2021-03-05 00:18:19
【问题描述】:

我使用 Python 3 并想用一个自定义类包装 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 上的警告是“期望字典,得到字典”,但它正在工作。这是一个误报警告还是可以在没有警告的情况下做得更好?此警告背后是否存在真正有助于避免的问题?

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

【问题讨论】:

  • 我现在也看到了另一个警告。如果我想用CustomParser(formatter_class=argparse.HelpFormatter) 更改默认格式化程序,我会收到警告“预期类型'Type[RawDescriptionHelpFormatter]',得到'Type[HelpFormatter]'”,可以用# noinspection PyTypeChecker 抑制。这也是误报吗?

标签: python python-3.x intellij-idea super keyword-argument


【解决方案1】:

是的,这似乎是误报。

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

【讨论】:

  • 你知道一个方便的例子,这个警告是一个真正的问题而不是误报吗?自从最后一个问题以来,我在 Python 中没有做太多事情,这看起来很容易出错,对吧?
  • 一周前 Pavel Karateev 在youtrack.jetbrains.com/issue/PY-27935 中解释说这只是一个错误,现在已在 pycharm 2017.3.3 RC 中修复; cf 基础错误中的简单重复 youtrack.jetbrains.com/issue/PY-27686
  • 看起来您的链接错误仅涉及 python 2,您确定此版本解决了此 python 3 误报警告吗?如果我有时间,我会更新并验证这一点。
  • 完全正确,这完全是 python2 的事情。您可能想为 python3 提交一个新错误。
【解决方案2】:

将存储在项目中的所有虚拟环境目录(例如./venv)标记为已排除已使用 PyCharm 2020.2.3 为我解决了这个问题。

为此:右键单击项目树中的虚拟环境目录并选择:Mark Directory as->Excluded。来自https://youtrack.jetbrains.com/issue/PY-39715的解决方案。

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2017-06-23
    相关资源
    最近更新 更多