Pylint递归扫描Bug:目录名互为前缀时出现异常
Pylint在目录名前缀冲突时的异常行为原因解析
问题场景
当项目中存在一个带__init__.py的合法Python包目录,且另一个目录名以该包名作为前缀时,Pylint会出现异常:本该检测到的代码问题(如未使用的导入)被遗漏。
复现步骤
mkdir pylint_test cd pylint_test mkdir dataset touch dataset/__init__.py mkdir dataset_123 echo "from collections import Counter" > dataset_123/a.py echo "[master]\nenable= all" > pylintrc pylint --recursive=y .
执行后未检测到a.py中未使用的Counter导入,不符合预期。
对比验证
- 移除
dataset/__init__.py后,重新执行扫描:
pylint --recursive=y .
得到正常检测结果:
************* Module a dataset_123/a.py:1:0: C0114: Missing module docstring (missing-module-docstring) dataset_123/a.py:1:0: W0611: Unused Counter imported from collections (unused-import)
重命名目录为
eval和eval_123(保留eval/__init__.py),扫描正常工作。重命名
dataset_123为dataset_b123(保留dataset/__init__.py),扫描也能正常报告问题。
原因分析
这是Pylint内部模块扫描逻辑的bug:
当存在带__init__.py的合法包(如dataset),且另一目录名满足[包名]_数字格式(如dataset_123)时,Pylint的递归扫描会错误地将该目录与前置包关联,没有将其下的.py文件识别为独立模块,从而跳过了代码检查。
而当目录后缀为字母开头(如dataset_b123),或前置目录不是合法包(无__init__.py)时,Pylint的扫描逻辑不会触发该bug,能正常识别所有模块。
环境信息
- 系统:Mac Ventura 13.4.1
- 版本:
pylint --version pylint 2.15.2 astroid 2.13.5 Python 3.8.13 (default, Oct 19 2022, 17:52:09) [Clang 12.0.0 ]
内容的提问来源于stack exchange,提问作者Ivaylo Strandjev
相关产品推荐
相关产品推荐

