pylint检测git.exc相关代码出现E1101误报问题咨询
Pylint E1101错误:git.exc模块被误判为异常实例的问题
问题重现
先看这段能正常运行的Python代码:
import git try: raise git.exc.GitCommandError("dummy", "foo") except git.exc.GitCommandError as exc: print(exc)
但用pylint 2.3.1检测时,却弹出一堆E1101: no-member错误:
************* Module test [无关错误已移除] test.py:4:7: E1101: Instance of 'GitError' has no 'GitCommandError' member (no-member) test.py:4:7: E1101: Instance of 'Exception' has no 'GitCommandError' member (no-member) test.py:5:7: E1101: Instance of 'Exception' has no 'GitCommandError' member (no-member) test.py:5:7: E1101: Instance of 'GitError' has no 'GitCommandError' member (no-member) --------------------------------------------------------------------- Your code has been rated at -36.00/10 (previous run: 4.00/10, -40.00)
关键验证:git.exc是模块,不是异常
我特意在Python交互环境里确认了这点:
python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.import git
git.exc
<module 'git.exc' from '/tmp/tmp.ULCyvtUQWx/testenv/lib/python3.5/site-packages/GitPython-2.1.11-py3.5.egg/git/exc.py'>
结论:这是pylint的Bug,不是你的问题
你完全没有认知疏漏,这就是pylint静态分析的一个错误:
- pylint错误地把
git.exc当成了GitError或者Exception的实例,而不是一个模块,所以它认为GitCommandError不是git.exc的成员。 - 至于用
git.GitCommandError就没问题,是因为GitPython在顶层的git模块里已经导入了这个类,相当于做了个“快捷引用”,pylint能正确识别这个顶层的导出。
临时解决办法
如果想躲开这个错误,有两个选择:
- 直接用
git.GitCommandError代替git.exc.GitCommandError,虽然后者才是类的原始定义路径; - 在代码里加pylint的忽略注释,精准屏蔽这个错误:
import git try: raise git.exc.GitCommandError("dummy", "foo") # pylint: disable=no-member except git.exc.GitCommandError as exc: # pylint: disable=no-member print(exc)
内容的提问来源于stack exchange,提问作者Frank Lichtenheld
相关产品推荐
相关产品推荐

