如何让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.2
, logilab_common 0.63.2
, pylon 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.array
和np.zeros
等等,你可以写np_array
, np_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.zeros
, np.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)
-
在一些老版本的
pylint
有一个问题阻止它使用numpy(和其他类似的包)。 -
现在这个问题已经解决了,但是出于安全原因,外部C程序包(到C代码类的numpy的python接口)默认是禁用的。
-
你可以创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之后回答了一切正常。