如何使用pylint或mypy捕获可能未定义的变量?

0 投票
2 回答
171 浏览
提问于 2025-04-13 16:30
import time

if time.time() > 42:
    x = 1

print(x)

我的开发工具(PyCharm)提醒我,x 可能没有定义:

在这里输入图片描述

但是 pylintmypy 却没有任何提示。有没有办法让它们也对这种情况发出警告呢?

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],会导致大量的误报。

撰写回答