加载自定义Pylint插件触发KeyError: None错误该如何解决
报错根因
这个KeyError: None是插件加载失败触发的衍生错误:pylint检测到插件加载异常后要上报bad-plugin-value错误,此时还没开始扫描业务代码,模块名变量为None,触发统计逻辑的键缺失报错。你需要修正插件本身的代码错误和加载方式,具体修改如下:
1. 修复__init__.py代码
原有问题:shebang位置错误、代码存在多余前导缩进、导入类名错误。
修正后代码:
#!/usr/bin/env python """ Register all plugin """ from .check_os_walk import CheckOswalk def register(linter): """ entry point for pylint :param linter: linter obj :return: """ linter.register_checker(CheckOswalk(linter))
2. 修复check_os_walk.py代码
原有问题:消息字典属性名错误(应该是msgs不是msg)、检查逻辑错误(所有标识符都会触发告警,没有判断是否为os.walk)。
修正后代码:
#!/usr/bin/env python import astroid from pylint.checkers import BaseChecker from pylint.interfaces import IAstroidChecker class CheckOswalk(BaseChecker): __implements__ = (IAstroidChecker,) name = 'no-need-to-call-os-walk' msgs = { 'R1000': ( 'please avoid using os.walk', 'os.walk_used', 'os.walk use unless it is needed and prefer os.scandir in python3' ) } def visit_attribute(self, node): # 仅匹配os.walk的属性访问场景 if node.attrname == 'walk' and isinstance(node.expr, astroid.Name) and node.expr.name == 'os': self.add_message('os.walk_used', node=node)
3. 修正插件加载命令
--load-plugins参数接收的是Python模块名,不是文件路径,你需要先把插件所在目录加入PYTHONPATH后再加载。
如果你的插件文件直接放在当前目录下,执行命令改为:
export PYTHONPATH=$PWD venv/bin/pylint --load-plugins=__init__ dir_traversal.py
如果你的插件放在独立的目录(比如pylint_custom_plugin)下,执行命令改为:
export PYTHONPATH=$PWD venv/bin/pylint --load-plugins=pylint_custom_plugin dir_traversal.py
修改完成后执行命令即可正常扫描,触发os.walk_used告警。
内容的提问来源于stack exchange,提问作者user765443
相关产品推荐
相关产品推荐

