IntelliJ Python 3检查"预期字典,得到一个字典"对于**kwargs超级误报?

jan*_*jan 21 python intellij-idea super kwargs python-3.x

我使用Python 3并希望使用默认argparse.ArgumentParser设置的自定义类 进行换行formatter_class=argparse.RawDescriptionHelpFormatter.我可以成功地做到这一点,但IntelliJ IDEA 2017.1与Python插件(PyCharm)给出了以下代码的警告:

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
Run Code Online (Sandbox Code Playgroud)

如果使用IntelliJ抑制命令删除注释,则对kwargs的警告是"预期字典,得到字典",但它正在工作.这是一个误报警告,还是在没有警告的情况下可以做得更好?这个警告背后是否有一个真正的问题,它有助于避免?

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

J_H*_*J_H 12

是的,这似乎是误报.

你问过formatter_class=kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter).请不要这样做.变异kwargs,似乎是下一个论点,似乎是坏的.此外,默认关键字args应设置为简单常量而不是某些可变数据结构,因为在导入时评估和运行时评估之间存在很大差异.参见例如http://www.effbot.org/zone/default-values.htm.通常的成语将formatter_class=None在签名中,然后在身体中你测试无,并且你将kwargs变成你心中的内容.

  • 一周前,Pavel Karateev在https://youtrack.jetbrains.com/issue/PY-27935中解释说这只是一个错误,现在修复了pycharm 2017.3.3 RC; cf base rep-by in base bug https://youtrack.jetbrains.com/issue/PY-27686 (4认同)