pylint 1.4 在所有 C 扩展上报告 E1101(no-member)
pylint 1.4 reports E1101(no-member) on all C extensions
我们一直是 pylint
的长期粉丝。它的静态分析已成为我们所有 python 项目的重要组成部分,并节省了大量时间来寻找不明显的错误。但是从 1.3 -> 1.4 升级后,几乎所有编译的 c 扩展都会导致 E1101(no-member) 错误。
以前 运行 通过 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
我的问题是,有没有其他人目睹过这一切?如果是这样,您愿意分享您的 workaround/solution 吗?
我们尝试创建插件来抑制这些警告
(http://docs.pylint.org/plugins.html#enter-plugin),但我们很难弄清楚文档的正面或反面——而且 astroid
基础 class 非常复杂,我们无法理解它。
为了获得真正的奖励积分(以及我们永恒的感激之情),我们很想了解 pylint
中发生了什么变化。我们很乐意修复满足 pylint
的代码(或至少为 C 扩展作者发布最佳实践文档)。
平台详情
$ 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)]
发布问题后不久,我找到了答案。更改实际上是作为一种安全措施故意进行的。 Pylint 导入模块以有效识别有效的方法和属性。决定导入不属于 python stdlib 的 c 扩展是一种安全风险,可能会引入恶意代码。
这是在 Astroid 1.3.1 版本中完成的 https://mail.python.org/pipermail/code-quality/2014-November/000394.html
Only C extensions from trusted sources (the standard library) are
loaded into the examining Python process to build an AST from the live
module.
如果你想在导入非 stdlib c 扩展的项目上使用 pylint,有四种解决方案。
1) 使用--unsafe-load-any-extension=y
命令行选项禁用安全。此功能未记录并归类为隐藏选项 (https://mail.python.org/pipermail/code-quality/2014-November/000439.html)。
2) 使用 pylint.rc
设置 unsafe-load-any-extensions=yes
禁用安全。推荐使用选项 1,并在默认 pylint.rc 文件(使用 --generate-rcfile
创建)中包含完整文档。
3) 使用 extension-pkg-whitelist=
选项在 pylint.rc
文件中专门列出您信任由 pylint 加载的包或模块名称。
4) 创建一个插件来操作 AST(我不知道如何实现这个——但它经常在 pylint 邮件列表上讨论)。
我们选择了选项 3。我们将以下行添加到我们的项目 pylint.rc
文件中:
extension-pkg-whitelist=lxml
@user590028,非常感谢您的回答!我只是 运行 遇到了与库 win32api、win32evtlog、win32file、win32gui 和 win32process 相同的问题,您的解决方案有效。
我使用了另一种我认为值得在这里发布的方法,即调用pylint并将白名单包作为参数传递:
pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py
对于那些使用 VS Code 的人来说,要找到放置命令的位置有点棘手,因为我找不到我的可执行文件。
在 VS 代码中;
- 单击文件 > 首选项 > 设置。
- 向下滚动到左侧的 "Python Configurations" window
- 向下滚动到右边的 "Python Linting: Mypy Args" window
- 点击 "Edit in settings.json" link
- 编辑 json 以包括:
"--extension-pkg-whitelist="
我不得不做所有这些,因为 PyLint 不能从我的 Windows 命令行执行...
如果您正在为 Mac 使用 VS Code,则需要执行以下操作才能编辑 settings.json 文件:
- 单击代码(即 'File' 选项卡左侧的 Visual Studio 代码选项卡)-> 首选项 -> 设置
- 向下滚动到扩展并点击列表中的 Python。
- 单击任何
Edit in settings.json
链接。这会打开 settings.json
进行编辑。
- 添加行
"python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"]
.
我们一直是 pylint
的长期粉丝。它的静态分析已成为我们所有 python 项目的重要组成部分,并节省了大量时间来寻找不明显的错误。但是从 1.3 -> 1.4 升级后,几乎所有编译的 c 扩展都会导致 E1101(no-member) 错误。
以前 运行 通过 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
我的问题是,有没有其他人目睹过这一切?如果是这样,您愿意分享您的 workaround/solution 吗?
我们尝试创建插件来抑制这些警告
(http://docs.pylint.org/plugins.html#enter-plugin),但我们很难弄清楚文档的正面或反面——而且 astroid
基础 class 非常复杂,我们无法理解它。
为了获得真正的奖励积分(以及我们永恒的感激之情),我们很想了解 pylint
中发生了什么变化。我们很乐意修复满足 pylint
的代码(或至少为 C 扩展作者发布最佳实践文档)。
平台详情
$ 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)]
发布问题后不久,我找到了答案。更改实际上是作为一种安全措施故意进行的。 Pylint 导入模块以有效识别有效的方法和属性。决定导入不属于 python stdlib 的 c 扩展是一种安全风险,可能会引入恶意代码。
这是在 Astroid 1.3.1 版本中完成的 https://mail.python.org/pipermail/code-quality/2014-November/000394.html
Only C extensions from trusted sources (the standard library) are loaded into the examining Python process to build an AST from the live module.
如果你想在导入非 stdlib c 扩展的项目上使用 pylint,有四种解决方案。
1) 使用--unsafe-load-any-extension=y
命令行选项禁用安全。此功能未记录并归类为隐藏选项 (https://mail.python.org/pipermail/code-quality/2014-November/000439.html)。
2) 使用 pylint.rc
设置 unsafe-load-any-extensions=yes
禁用安全。推荐使用选项 1,并在默认 pylint.rc 文件(使用 --generate-rcfile
创建)中包含完整文档。
3) 使用 extension-pkg-whitelist=
选项在 pylint.rc
文件中专门列出您信任由 pylint 加载的包或模块名称。
4) 创建一个插件来操作 AST(我不知道如何实现这个——但它经常在 pylint 邮件列表上讨论)。
我们选择了选项 3。我们将以下行添加到我们的项目 pylint.rc
文件中:
extension-pkg-whitelist=lxml
@user590028,非常感谢您的回答!我只是 运行 遇到了与库 win32api、win32evtlog、win32file、win32gui 和 win32process 相同的问题,您的解决方案有效。
我使用了另一种我认为值得在这里发布的方法,即调用pylint并将白名单包作为参数传递:
pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py
对于那些使用 VS Code 的人来说,要找到放置命令的位置有点棘手,因为我找不到我的可执行文件。
在 VS 代码中;
- 单击文件 > 首选项 > 设置。
- 向下滚动到左侧的 "Python Configurations" window
- 向下滚动到右边的 "Python Linting: Mypy Args" window
- 点击 "Edit in settings.json" link
- 编辑 json 以包括: "--extension-pkg-whitelist="
我不得不做所有这些,因为 PyLint 不能从我的 Windows 命令行执行...
如果您正在为 Mac 使用 VS Code,则需要执行以下操作才能编辑 settings.json 文件:
- 单击代码(即 'File' 选项卡左侧的 Visual Studio 代码选项卡)-> 首选项 -> 设置
- 向下滚动到扩展并点击列表中的 Python。
- 单击任何
Edit in settings.json
链接。这会打开settings.json
进行编辑。 - 添加行
"python.linting.pylintArgs": ["----extension-pkg-whitelist=1xml"]
.