我正在Python项目上运行PyLint。 PyLint对无法找到numpy成员提出了许多抱怨。如何在避免跳过会员资格检查的同时避免这种情况。
来自代码:
import numpy as np
print np.zeros([1, 4])
当跑步时,我得到了预期的结果:
[[0. 0. 0。0]]
但是,pylint给了我这个错误:
E:3,6:模块'numpy'没有'零'成员(无成员)
对于版本,我使用pylint 1.0.0(astroid 1.0.1,常见的0.60.0)并尝试使用numpy 1.8.0。
答案 0 :(得分:69)
如果将Visual Studio Code与Don Jayamanne的优秀Python extension一起使用,请将用户设置添加到白名单numpy:
{
// whitelist numpy to remove lint errors
"python.linting.pylintArgs": [
"--extension-pkg-whitelist=numpy"
]
}
答案 1 :(得分:54)
我在这里遇到了同样的问题,即使是所有相关软件包的最新版本(astroid 1.3.2
,logilab_common 0.63.2
,pylon 1.4.0
)。
以下解决方案就像魅力一样:我在numpy
部分修改了我的pylintrc
文件,将[TYPECHECK]
添加到了被忽略模块列表中:
[TYPECHECK]
ignored-modules = numpy
根据错误,您可能还需要添加以下行(仍在[TYPECHECK] section
中):
ignored-classes = numpy
答案 2 :(得分:39)
在最新版本的pylint中,您可以将--extension-pkg-whitelist=numpy
添加到您的pylint命令中。他们以不安全的方式在早期版本中解决了这个问题。现在,如果您希望它们更仔细地查看标准库之外的包,则必须将其明确列入白名单。 See here.
答案 3 :(得分:38)
我正在为一个正在研究的小型numpy项目得到同样的错误,并决定忽略numpy模块就可以了。我创建了一个.pylintrc
文件:
$ pylint --generate-rcfile > ~/.pylintrc
并按照paduwan和j_houg的建议修改了以下部门:
[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
它“修复”了我的问题。
答案 4 :(得分:17)
由于这是谷歌的最佳结果,它给我的印象是你必须忽略所有文件中的警告:
问题实际上已在上个月的{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来克隆。
答案 5 :(得分:7)
为了忽略numpy.core属性生成的所有错误,我们现在可以使用:
$ pylint a.py --generated-members=numpy.*
作为另一种解决方案,将此选项添加到〜/ .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.*
对于现在提到的问题代码,这似乎是简化的,但对另一个模块仍然很重要,即。 netifaces 等等。
答案 6 :(得分:6)
在过去几年中,有许多不同的错误报告,即https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports
我建议禁用发生投诉的线路。
# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103
答案 7 :(得分:6)
可能它与numpy的方法导入的深奥方法相混淆。即,zeros
实际上是numpy.core.multiarray.zeros
,使用声明
from .core import *
依次导入
from .numeric import *
并以数字形式找到
zeros = multiarray.zeros
我想我会因为PyLint而感到困惑!
有关PyLint的一面,请参阅this bug。
答案 8 :(得分:4)
在扩展到j_hougs的答案中,您现在可以将相关模块添加到.pylintrc中的这一行,该行在生成时已经准备为空:
extension-pkg-whitelist=numpy
您可以通过执行以下操作生成示例.pylintrc:
pylint --generate-rcfile > .pylintrc
然后编辑提到的行
答案 9 :(得分:4)
Pylint 1.8.2终于解决了这个问题。开箱即用,不需要pylintrc调整!
答案 10 :(得分:3)
这似乎至少适用于Pylint 1.1.0:
[TYPECHECK]
ignored-classes=numpy
答案 11 :(得分:3)
这是我为这个问题提出的伪解决方案。
#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
等。
这种方法的优点与其他答案中提出的其他方法相比:
明显的缺点是你必须明确地导入你使用的每个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捕获。
答案 12 :(得分:3)
我必须在任何我使用numpy的文件的顶部添加它。
# To ignore numpy errors:
# pylint: disable=E1101
万一有人在日食中遇到Pydev和pylint的麻烦......
答案 13 :(得分:2)
我有numpy,scipy,sklearn,nipy等问题,我通过像这样包装epylint解决了这个问题:
$ 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案例来扩展它。
N.B。:如果这适用于你,那么你想要修改你的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的链接。希望这对某人有用。
答案 14 :(得分:2)
如果您不想添加更多配置,请将此代码添加到您的配置文件中,而不是“ whitelist”。
{
"python.linting.pylintArgs": ["--generate-members"],
}
答案 15 :(得分:2)
我在另一个模块(kivy.properties
)上遇到了同样的问题,该模块是像numpy
这样的包装C模块。
使用VSCode V1.38.0,已接受的解决方案停止了该项目的所有棉绒。因此,尽管确实删除了误报no-name-in-module
,但并没有真正改善这种情况。
对我来说,最好的解决方法是在有问题的模块上使用--ignored-modules
参数。麻烦的是,通过python.linting.pylintArgs
传递任何参数会抹去default VSCode settings,因此您也需要重新设置它们。那给我留下了以下settings.json文件:
{
"python.pythonPath": "C:\\Python\\Python37\\python.exe",
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"python.linting.pylintArgs": [
"--ignored-modules=kivy.properties",
"--disable=all",
"--enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode"
]
}
答案 16 :(得分:1)
从上一个答案中复制一点点来总结一下是什么工作(至少对我而言:debian-jessie)
在某些旧版本的pylint
中,存在一个问题,导致它无法使用numpy(以及其他类似的软件包)。
现在问题已经解决,但出于安全原因,默认情况下禁用了外部C包(C代码类似numpy-的python接口)。
您可以创建一个白名单,以允许pylint
在文件~/.pylintrc
中使用它们。
运行的基本命令: #仅在您家中没有.pylintrc文件的情况下 $ pylint --generate-rcfile&gt; .pylintrc
然后打开文件并在逗号分隔extension-pkg-whitelist=
之后添加所需的包。您可以使用命令行中的--extension-pkg-whitelist=numpy
选项获得相同的行为。
如果忽略[TYPECHECK]
部分中的某些包,则表示pylint
永远不会显示与该包相关的错误。在实践中,pylint
不会告诉您有关这些包的任何信息。
答案 17 :(得分:1)
此解决方案对我有用
基本上,请从左下角选择齿轮图标=>设置=>工作区设置=>扩展=> Python配置=>单击任何Settings.json =>将此添加到文件中 “ python.linting.pylintArgs”:[“ --extension-pkg-whitelist = numpy”] 我正在使用VS 1.27.2
答案 18 :(得分:0)
我一直在研究pylint的补丁,以解决numpy等库中动态成员的问题。它添加了一个“动态模块”选项,它强制在运行时通过真正导入模块来检查成员是否存在。见Issue #413 in logilab/pylint。还有一个拉取请求,请参阅其中一条评论中的链接。
答案 19 :(得分:0)
快速回答:将Pylint更新为1.7.1(如果使用conda管理包,请使用conda-forge提供的Pylint 1.7.1)
我在pylint GitHub here中发现了类似的问题,有人在更新为1.7.1后回复了所有内容。
答案 20 :(得分:0)
我不确定这是否是一个解决方案,但是在VSCode中,一旦我在用户设置中明确写入以启用pylint,所有模块都被识别。
{
"python.linting.pep8Enabled": true,
"python.linting.pylintEnabled": true
}
答案 21 :(得分:0)
最近(由于spyder或pylint或?中有所更改),我从astropy.constants符号的spyder静态代码分析中得到了E1101错误(“无成员”)。不知道为什么。
我对Linux或Unix系统(Mac可能与此类似)上的所有用户的简化解决方案是创建一个/ etc / pylintrc,如下所示:
[TYPECHECK]
ignored-modules=astropy.constants
当然,可以将其放在个人$ HOME / .pylintrc文件中。 而且,我本可以更新现有文件。
答案 22 :(得分:0)
这是生成成员的旧错误。如果您使用 numpy 以外的其他名称,例如 np 或 foo,则必须将其添加到 Pylint 配置中(空格或逗号分隔 -不管),因为 Pylint 不承认这一点。所以它应该是这样的:
[pylint]
generated-members=numpy.*,np.*,foo.*
它甚至会在无成员错误中抛出完整路径,但表达式需要准确。这是一个老错误,似乎很快就会修复。检查Issue #2498 in logilab/pylint。