【问题标题】:Mandatory member function arguments - to much expectations from Python compiler and/or PyDev强制性成员函数参数 - 对 Python 编译器和/或 PyDev 的期望很高
【发布时间】:2021-09-23 07:14:13
【问题描述】:

我很久以前就创建了 CustomErr 类(继承自 Python 的 Exception),并且我在代码中的几百个地方使用它。它有一个用def logErr(self) 声明的成员方法。

一段时间后我发现这个函数应该有强制关键字参数logger,所以我把函数的声明改为def logErr(self, *, logger)

在此更改之后,我预计会出现数百个编译器错误,或者至少会出现警告(因此我可以轻松地进行所需的更改),但它没有发生 - 没有报告一个错误。只有在调用此函数时才会出现运行时异常。

我是否对 Python 编译器和/或我的工作 IDE(我正在使用 Eclipse 和 PyDev 8.1、Python 3.8.7)期望过高?

我需要 Python linter 吗?

【问题讨论】:

  • Python 不是编译语言。这样的错误会在运行时发生,因为即使是方法也可以随时修改或替换。
  • @KlausD。但您通常希望 IDE 会针对此类情况发出警告。
  • 欢迎来到 StackOverflow!关于您的问题:似乎无法直接回答。答:是的。您期望静态类型语言的 python 行为。 B. “我需要棉绒吗?” - 由您来决定哪个和哪个设置。我们同时使用其中 3 个:flake8 用于 cicd,pylint 用于手动检查,mypy 用于测试签名
  • 在外部工具中,mypy 和 pyright 应该能够看到该错误。 PyCharm IDE 当然可以。正如 Klaus 所说,Python 解释器不在乎。
  • 感谢您的回答,我是从 C++ 和 Java 来到 Python 的,所以我的期望很高。我可能会尝试使用 pylint(对于 mypy 来说太晚了)。

标签: python pydev


【解决方案1】:

PyDev 默认情况下并没有真正提供这种检查——它确实内置了代码分析,但它专注于非常快速和极少的误报,它并没有真正深入研究类型——检查领土。

PyDev 中,推荐的处理方法是通过外部 linter 或类型检查器。

PyDevFlake8MypyPyLint集成(相关配置在PyDev > Editor > Code Analysis > Flake8/Mypy/PyLint下)。

如果您在代码中使用类型提示,启用Mypy 可能很容易,并且实际上需要在 PyDev 中使用这种类型进行代码分析...开箱即用 PyDev 将使用该信息用于代码完成,但没有计划将其添加到代码分析中,因为我有点担心复制Mypy 中已有的内容,而且我认为拥有另一个类型检查器没有太多好处。

PyLint 也可能很有趣,因为它确实会出现一些有趣的错误(但根据我的经验,它通常也有更高的误报率,因此可能需要进行更多调整)——如果你不这样做t 使用类型提示(因此不会真正从 Mypy 获得太多),我认为使用 PyLint 很有趣,因为它确实试图覆盖比 PyDev 更多的领域。

请注意,如果您不使用类型检查/MyPy,则任何工具都可能无法 100% 确定地实现您想要的,因为很难发现 parameter.logErr 表示 @ 987654335@ 在您的CustomErr 中,而不是真正的其他logErr 其他地方(因为发现parameter 的类型是CustomErr 真的很难)。

ps:在您保存每个文件时会自动运行类型检查器/linter,但您也可以通过右键单击项目/文件然后选择 PyDev > Code Analysis 为整个项目运行它。

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多