如何使用pylint或mypy捕获可能未定义的变量?
2 个回答
1
虽然 mypy
似乎没有报告可能未定义的变量,但它会产生
C0103: Constant name "x" doesn't conform to UPPER_CASE naming style (invalid-name)
虽然这不是重点,但总比没有好。另外要注意的是,mypy
其实不是你想要的那种代码检查工具,而是一个类型检查工具。
接下来,我试了 pylint
,但它对此保持沉默,尽管有可能相关的检查项 E0602 (UnboundLocalError)
。我在你的代码中没有找到改变这种行为的方法。
深入研究后,我发现了一个关于 mypy 的旧问题,链接在这里 未检测到 UnboundLocalError,尽管这个问题已经有些年头,但读起来还是挺有意思的。我检查了那里面提到的工具,pyright
发出了警报:
test.py:6:7 - error: "x" is possibly unbound (reportPossiblyUnboundVariable)
2
mypy 有部分支持通过错误代码 [possibly-undefined]
,你可以通过以下几种方式来启用它:
在运行 mypy 的命令行中使用 (
mypy <...> --enable-error-code possibly-undefined
);在 mypy 配置文件中设置,格式如下
[mypy] enable_error_code = possibly-undefined
在 文件级配置的注释行中
# mypy: enable-error-code=possibly-undefined
你可以在 mypy Playground 中查看你的示例演示。
*部分支持,因为 mypy 将带注解的赋值语句视为隐式存在声明;它不会捕捉到这个例子:
import time
x: int # Annotated assignment statement with no value set
if time.time() > 42:
x = 1
print(x) # No errors caught here
需要注意的是,就实际效果而言,这已经足够作为完全支持。类型检查器无法确定所有执行路径是否都能被满足(例如)独立的条件块;如果再进一步推断 [possibly-undefined]
,会导致大量的误报。