我们长期以来一直是pylint
的粉丝。它的静态分析已经成为我们所有Python项目中至关重要的一部分,并节省了大量时间来追踪难以捉摸的错误。但是从1.3升级到1.4后,几乎所有编译的C扩展都会产生E1101(未知成员)错误。
之前在pylint
1.3下完美运行的项目现在会对几乎每个C扩展成员都报告E1101错误。我们不得不禁用E1101错误,但这实质上降低了pylint
的有用性。
例如,这是lxml
包的完全有效使用:
r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')
运行这个代码通过pylint
,它会报告:
$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E: 3, 6: Module 'lxml.etree' has no 'Element' member (no-member)
但这是完全有效的:
$ python valid.py
<Element mydoc at 7fddf67b1ba8>
这里变得真的很奇怪。只有极少数的C扩展似乎能够通过pylint
正常工作,例如:
r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version
$ pylint -rn valid2.py
No config file found, using default configuration
我的问题是,有没有其他人见过这种情况?如果是这样,你愿意分享你的解决方法吗?
我们尝试创建插件来抑制这些警告(http://docs.pylint.org/plugins.html#enter-plugin),但我们很难理解文档 - astroid
基类非常复杂,我们也无法理解它。
为了得到额外的奖励分数(和我们永恒的感激),我们希望了解在pylint
中发生了什么变化。我们将很乐意修复代码(或至少发布最佳实践文档给C扩展作者),以满足pylint
。
平台细节
$ pylint --version
No config file found, using default configuration
pylint 1.4.0,
astroid 1.3.2, common 0.63.2
Python 2.7.5 (default, Jul 1 2013, 18:09:11)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]
multiprocessing
。 - 4ae1e1extension-pkg-allow-list
。 - Luciano