如何让PyLint识别numpy成员?

时间:2013-12-12 20:27:12

标签: python numpy pylint

我正在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。

23 个答案:

答案 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.2logilab_common 0.63.2pylon 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,使用声明

导入numpy
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.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捕获。

答案 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)

  1. 在某些旧版本的pylint中,存在一个问题,导致它无法使用numpy(以及其他类似的软件包)。

  2. 现在问题已经解决,但出于安全原因,默认情况下禁用了外部C包(C代码类似numpy-的python接口)。

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

  4. 运行的基本命令:     #仅在您家中没有.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 以外的其他名称,例如 npfoo,则必须将其添加到 Pylint 配置中(空格或逗号分隔 -不管),因为 Pylint 不承认这一点。所以它应该是这样的:

[pylint]
generated-members=numpy.*,np.*,foo.*

它甚至会在无成员错误中抛出完整路径,但表达式需要准确。这是一个老错误,似乎很快就会修复。检查Issue #2498 in logilab/pylint