如何用pylint或mypy检测可能未定义的变量?
让pylint或mypy检测变量未定义的情况
使用mypy检测
mypy作为静态类型检查工具,要识别这种变量可能未定义的场景,需配合类型注解和严格检查模式:
- 添加类型注解:给变量
x声明类型,明确其预期类型:
import time x: int if time.time() > 42: x = 1 print(x)
- 运行mypy并启用严格模式:
执行命令:
mypy --strict your_script.py
此时mypy会抛出错误提示:Variable "x" is not assigned on all paths [variable-not-assigned],明确指出x存在未赋值的执行路径。
若不想启用全量严格模式,也可单独启用相关检查项:
mypy --warn-unreachable --warn-no-return your_script.py
使用pylint检测
pylint默认会判定time.time() > 42这个条件永远为真(当前时间戳远大于42),因此认为x一定会被赋值,不会触发警告。要让pylint检测这种情况,可通过以下方式:
- 修改条件为动态不确定形式:
将直接判断改为变量中转,让pylint无法确定条件的真假:
import time should_assign = time.time() > 42 if should_assign: x = 1 print(x)
运行pylint即可触发Used variable 'x' before assignment (used-before-assignment)警告。
- 强制忽略条件真值推测:
在条件行添加注释,禁用pylint对该条件的真值判断:
import time if time.time() > 42: # pylint: disable=condition-evals-to-true x = 1 print(x)
然后运行pylint(确保used-before-assignment检查已启用,默认已开启,未开启可添加--enable=used-before-assignment参数):
pylint your_script.py
此时pylint会抛出Used variable 'x' before assignment (used-before-assignment)警告。
也可在pylint配置文件(如.pylintrc)中添加全局配置,禁用条件真值推测:
[TYPECHECK] condition-evals-to-true=disabled
内容的提问来源于stack exchange,提问作者Tobias Hermann
相关产品推荐
相关产品推荐

