Python pylint 1.4报告所有C扩展上的E1101(无成员)

Python pylint 1.4报告所有C扩展上的E1101(无成员),python,pylint,python-extensions,Python,Pylint,Python Extensions,我们一直是pylint的粉丝。它的静态分析已经成为我们所有python项目的一个关键部分,并且节省了大量的时间来追踪那些模糊的bug。但从1.3->1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误 以前完全通过pylint1.3运行的项目现在抱怨几乎所有使用E1101的C扩展成员。我们被迫禁用E1101错误,但这严重影响了pylint的实用性 例如,lxml包的这种完全有效的使用 r"""valid.py: demonstrate pylint 1.4 error""" fro

我们一直是
pylint
的粉丝。它的静态分析已经成为我们所有python项目的一个关键部分,并且节省了大量的时间来追踪那些模糊的bug。但从1.3->1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误

以前完全通过
pylint
1.3运行的项目现在抱怨几乎所有使用E1101的C扩展成员。我们被迫禁用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>
我的问题是,还有谁目睹了这一切?如果是这样,您是否愿意分享您的解决方法/解决方案

我们已经尝试创建插件来抑制这些警告 (),但我们在制作文档的头尾方面遇到了困难,
astroid
基类是uber复杂的,我们无法尝试去探索它

为了获得真正的奖励积分(以及我们永恒的感激之情),我们很想了解在
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)]

发布我的问题后不久,我找到了答案。事实上,这一改变是作为一项安全措施故意进行的。Pylint导入模块以有效识别有效的方法和属性。决定导入不属于python stdlib的c扩展是一种安全风险,可能会引入恶意代码

这是在Astroid 1.3.1版本中完成的

仅支持来自可信源(标准库)的C扩展 加载到正在检查的Python进程中,以从live 模块

如果要在导入非stdlib c扩展的项目上使用pylint,有四种解决方案

1) 使用
--unsafe load any extension=y
命令行选项禁用安全。此功能未记录,并归类为隐藏选项()

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

@用户590028,非常感谢您的回答!我刚刚在库win32api、win32evtlog、win32file、win32gui和win32process中遇到了同样的问题,您的解决方案很有效

我使用了另一种我认为值得在这里发布的方法,即调用pylint并将白名单上的包作为参数传递:

pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py

对于那些使用VS代码的人来说,由于我找不到可执行文件,所以查找命令的放置位置有点困难

在VS代码中

  • 单击文件>首选项>设置
  • 在左侧窗口中向下滚动到“Python配置”
  • 在右侧窗口中向下滚动到“Python Linting:Mypy Args”
  • 单击“在settings.json中编辑”链接
  • 编辑json以包括: “--扩展包白名单=”

  • 我不得不这么做,因为PyLint不能从我的Windows命令行执行…

    如果您使用Mac的VS代码,这就是编辑settings.json文件所需的操作:

  • 单击代码(即“文件”选项卡左侧的Visual Studio代码选项卡)->首选项->设置
  • 向下滚动到Extensions并单击列表中的Python
  • 单击settings.json中的任何
    编辑链接。这将打开
    settings.json
    进行编辑
  • 添加行
    “python.linting.pylintArgs”:[“----扩展包白名单=1xml”]

  • 不客气。仅供参考,
    扩展pkg白名单
    是选项3,与我们选择的相同。我只是想确保人们知道您也可以将其作为命令行参数传递给pylint。非常感谢。然而,我必须注意,选项3不幸地似乎不适用于某些STL包,例如,
    多处理
    。对于#4,本文档似乎直接解决了如何修复误报
    无成员
    的问题-感谢您指出这一点。更新链接:@SpainTrain对不起,链接又死了。我想他们不再做
    最新的
    重定向了。再次感谢您指出(再次是X-D)。通过编辑用户设置文件以包含以下行,我能够在pylint的VS代码中使用命令行参数:“python.linting.pylintArgs”:[“--safe load any extension=y”],
    
    pylint --extension-pkg-whitelist=win32api,win32evtlog,win32file,win32gui,win32process myfile.py