如何让PyLint识别numpy成员?

我正在Python项目上运行PyLint。 PyLint对于找不到numpy成员抱怨很多。 我怎样才能避免这一点,同时避免跳过会员检查。

从代码:

import numpy as np print np.zeros([1, 4]) 

其中,当跑,我得到预期的:

[[0.0.0.0]]

但是,pylint给我这个错误:

E:3,6:Module'numpy'没有'零'成员(非成员)

对于版本,我使用pylint 1.0.0(astroid 1.0.1,普通0.60.0),并尝试使用numpy 1.8.0。

我在这里也遇到同样的问题,即使是最新版本的所有相关软件包( astroid 1.3.2logilab_common 0.63.2pylon 1.4.0 )。

下面的解决scheme就像一个魅力:我通过修改我的pylintrc文件,在[TYPECHECK]部分添加numpy到被忽略的模块列表:

 [TYPECHECK] ignored-modules = numpy 

根据错误,您可能还需要添加以下行(仍在[TYPECHECK] section ):

 ignored-classes = numpy 

在最近的pylint版本中,您可以将--extension-pkg-whitelist=numpy到您的pylint命令中。 他们以不安全的方式解决了这个问题。 现在,如果您希望他们仔细查看标准库之外的软件包,则必须将其明确列入白名单。 看这里。

如果在Don Jayamanne出色的Python扩展中使用Visual Studio代码 ,请将用户设置添加到白名单numpy:

 { // whitelist numpy to remove lint errors "python.linting.pylintArgs": [ "--extension-pkg-whitelist=numpy" ] } 

我正在为我正在做的一个小的numpy项目得到同样的错误,并决定忽略numpy模块会做得很好。 我创build了一个.pylintrc文件:

$ pylint --generate-rcfile > ~/.pylintrc

并遵循了巴杜旺和j_houg的build议,我修改了以下部分:

 [MASTER] # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist=numpy 

 [TYPECHECK] # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules=numpy # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamically set). This supports can work # with qualified names. ignored-classes=numpy 

并“解决”了我的问题。

由于这是谷歌的最高结果,它给了我一个印象,你必须忽略所有文件中的警告:

这个问题实际上已经在上个月的pylint / astroid的源代码中修复了https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e,但是还没有在Ubuntu软件包中。;

为了获得来源,只是

 hg clone https://bitbucket.org/logilab/pylint/ hg clone https://bitbucket.org/logilab/astroid mkdir logilab && touch logilab/__init__.py hg clone http://hg.logilab.org/logilab/common logilab/common cd pylint && python setup.py install 

由此最后一步很可能需要一个sudo ,当然你需要mercurial克隆。

在过去的几年中,有许多不同的bug报告,即https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

我build议禁用投诉发生的线路。

 # pylint: disable=E1103 print np.zeros([1, 4]) # pylint: enable=E1103 

可能与numpy的深入方法导入混淆了。 也就是说, zeros实际上是numpy.core.multiarray.zeros ,在numpy中用语句导入

 from .core import * 

依次导入

 from .numeric import * 

和数字,你会发现

 zeros = multiarray.zeros 

我想我会混淆PyLint的地方!

从PyLint的angular度来看这个bug 。

这是我为这个问题提出的伪解决scheme。

 #pylint: disable=no-name-in-module from numpy import array as np_array, transpose as np_transpose, \ linspace as np_linspace, zeros as np_zeros from numpy.random import uniform as random_uniform #pylint: enable=no-name-in-module 

然后,在你的代码中,不要将numpy函数调用为np.arraynp.zeros等等,你可以写np_arraynp_zeros等等。

  • pylint禁用/启用仅限于您的代码的一个小区域
  • 这意味着你不必用pylint指令来包围每一个有numpy函数调用的行。
  • 你没有为你的整个文件做pylint的错误禁用,这可能会掩盖你的代码的其他问题。

明显的缺点是你必须明确地导入你使用的每一个numpy函数。 这个方法可以进一步详细阐述。 你可以定义你自己的模块,像下面这样调用它, numpy_importer

 """ module: numpy_importer.py explicitely import numpy functions while avoiding pylint errors """ #pylint: disable=unused-import #pylint: disable=no-name-in-module from numpy import array, transpose, zeros #add all things you need from numpy.random import uniform as random_uniform #pylint: enable=no-name-in-module 

然后,你的应用程序代码只能导入这个模块(而不是numpy)

 import numpy_importer as np 

并像往常一样使用名称: np.zerosnp.array

这样做的好处是你将有一个单一的模块,其中所有与numpy有关的导入都是一劳永逸的完成的,然后在任何你想要的地方用这一行导入它。 不过你必须小心, numpy_importer不会导入numpy中不存在的名字,因为那些错误不会被pylint捕获。

这似乎至less在Pylint 1.1.0上工作:

 [TYPECHECK] ignored-classes=numpy 

我有这个问题,numpy,scipy,sklearn,nipy等,我解决了这个问题:

$ cat epylint.py

 #!/usr/bin/python """ Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors Author: DOHMATOB Elvis Dopgima <gmdopp@gmail.com> <elvis.dohmatob@inria.fr> """ import os import sys import re from subprocess import Popen, STDOUT, PIPE NUMPY_HAS_NO_MEMBER = re.compile("Module 'numpy(?:\..+)?' has no '.+' member") SCIPY_HAS_NO_MEMBER = re.compile("Module 'scipy(?:\..+)?' has no '.+' member") SCIPY_HAS_NO_MEMBER2 = re.compile("No name '.+' in module 'scipy(?:\..+)?'") NIPY_HAS_NO_MEMBER = re.compile("Module 'nipy(?:\..+)?' has no '.+' member") SK_ATTR_DEFINED_OUTSIDE_INIT = re.compile("Attribute '.+_' defined outside __init__") REL_IMPORT_SHOULD_BE = re.compile("Relative import '.+', should be '.+") REDEFINING_NAME_FROM_OUTER_SCOPE = re.compile("Redefining name '.+' from outer scope") if __name__ == "__main__": basename = os.path.basename(sys.argv[1]) for line in Popen(['epylint', sys.argv[1], '--disable=C,R,I' # filter thesew arnings ], stdout=PIPE, stderr=STDOUT, universal_newlines=True).stdout: if line.startswith("***********"): continue elif line.startswith("No config file found,"): continue elif "anomalous-backslash-in-string," in line: continue if NUMPY_HAS_NO_MEMBER.search(line): continue if SCIPY_HAS_NO_MEMBER.search(line): continue if SCIPY_HAS_NO_MEMBER2.search(line): continue if "Used * or ** magic" in line: continue if "No module named" in line and "_flymake" in line: continue if SK_ATTR_DEFINED_OUTSIDE_INIT.search(line): continue if "Access to a protected member" in line: continue if REL_IMPORT_SHOULD_BE.search(line): continue if REDEFINING_NAME_FROM_OUTER_SCOPE.search(line): continue if NIPY_HAS_NO_MEMBER.search(line): continue # XXX extend by adding more handles for false-positives here else: print line, 

这个脚本简单地运行epylint,然后擦除它的输出来过滤出错误的警告和错误。 您可以通过添加更多elif案例来扩展它。

注意:如果这适用于你,那么你会想修改你的pychechers.sh,所以它喜欢这样

 #!/bin/bash epylint.py "$1" 2>/dev/null pyflakes "$1" pep8 --ignore=E221,E701,E202 --repeat "$1" true 

(当然,你必须先制作epylint.py可执行文件)

这里是我的.emacs https://github.com/dohmatob/mydotemacs的链接。; 希望这对某人有用。

在扩展到j_hougs答案中,现在可以将问题中的模块添加到.pylintrc中的这一行,该行已经在代中准备好了:

 extension-pkg-whitelist=numpy 

您可以通过执行以下操作来生成示例.pylintrc:

 pylint --generate-rcfile > .pylintrc 

然后编辑提到的行

我不得不在任何使用numpy的文件的顶部添加这个。

 # To ignore numpy errors: # pylint: disable=E1101 

以防月蚀中的某人遇到Pydev和pylint的问题

为了忽略numpy.core属性产生的所有错误,我们现在可以使用:

 $ pylint a.py --generated-members=numpy.* 

作为另一种解决scheme,将此选项添加到〜/ .pylintrc/ etc / pylintrc文件中:

 [TYPECHECK] # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members=numpy.* 

现在提到的问题代码现在看起来像还原剂,但仍然是另一个模块,即。 网格

我一直在为pylint开发一个补丁来解决像numpy这样的库中dynamic成员的问题。 它添加了一个“dynamic模块”选项,通过真正导入模块,强制检查运行时是否存在成员。 请参阅logilab / pylint中的问题#413 。 还有一个拉请求,请参阅其中一个评论的链接。

从以前的答案复制粘贴一点点总结什么工作(至less对我来说:debian-jessie)

  1. 在一些老版本的pylint有一个问题阻止它使用numpy(和其他类似的包)。

  2. 现在这个问题已经解决了,但是出于安全原因,外部C程序包(到C代码类的numpy的python接口)默认是禁用的。

  3. 你可以创build一个白名单,允许pylint在文件~/.pylintrc使用它们。

运行的基本命令:#只有在你的主目录中没有.pylintrc文件的时候#$ pylint –generate-rcfile> .pylintrc

然后打开文件并在extension-pkg-whitelist=用逗号分隔后添加你想要的软件包。 您可以使用命令行中的--extension-pkg-whitelist=numpy选项来执行相同的操作。

如果忽略[TYPECHECK]部分中的某些软件包,意味着pylint将永远不会显示与该软件包相关的错误。 实际上, pylint不会告诉你有关这些软件包的任何信息。

快速回答:将Pylint更新为1.7.1(如果使用condapipe理软件包,请使用conda-forge提供的Pylint 1.7.1)

我在这里发现了一个类似的问题在pylint GitHub中,并且有人在更新到1.7.1之后回答了一切正常。