PyLintにnumpyメンバーを認識させるにはどうすればよいですか?


163

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、common 0.60.0)を使用しており、numpy 1.8.0で動作するようにしています。

回答:


75

Don Jayamanneの優れたPython拡張機能Visual Studio Codeを使用する場合は、ホワイトリストnumpyにユーザー設定を追加します。

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

2
これは役に立ちました!VSCode 1.12.2では、Windows 10 x64で動作することが確認されています。
Simara

8
もっと必要なもの: "python.linting.pylintArgs":["--ignored-modules = numpy"、 "--ignored-classes = numpy"、 "--extension-pkg-whitelist = numpy"]
Peter

2
@Peterのソリューションは、Windows 7 x64およびVisual Studio Code 1.15.1で動作します!!
BSP 2017

3
@BSPピーターの投稿は問題を解決せず、無視します。私はこのコメントをdownvoteことができれば、私は..だろう
ジョナサン・H

4
これは、pylint 2.3.0ではもう機能しません。
ギロション

58

私もすべての関連パッケージの最新バージョンで、ここでは同じ問題を持っていました(astroid 1.3.2logilab_common 0.63.2pylon 1.4.0)。

次の解決策は魅力的なように機能numpypylintrcました[TYPECHECK]:セクションのファイルを変更して、無視されたモジュールのリストに追加しました:

[TYPECHECK]

ignored-modules = numpy

エラーによっては、次の行を追加する必要がある場合もあります(まだ内にあります[TYPECHECK] section)。

ignored-classes = numpy

2
pylint 1.4.4、astroid 1.3.8、Python 3.4.3がインストールされたLinuxでは、これは機能しましたが、.pylintrcファイルの見出しのextension-pkg-whitelist=numpy下に行を[MASTER]追加する必要がありました。pylintはかなり壊れやすいソフトウェアのようであり、基本的なタスクで機能させるにはエキスパートのタッチが必要です。
Eric Leschinski 2016年

12
これは良い解決策ではありません。それが行うのは、メンバーの存在についてのパイリントチェックを完全に無効にすることだけです。理想的には、それらを適切に認識してもらいたいのです。それが、他のソリューションが行うことです。
iFreilicht 2017年

1
@iFreilichtこれはセキュリティ対策です。実行時に、モジュール定義は動的に変更できます。しかし、pylintでこれを有効にするには、任意のコードを実行する必要があります。それにも関わらず、私はについての回答にある種のメモを期待し--extension-pkg-whitelistます。これは実際に指定されたモジュールのインポートを実行します。
Zev Spitz

43

私が取り組んでいる小さな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

そしてそれは私の問題を「修正」しました。


6
2つのignored-*入り口にも追加する必要がありますか?私にとっては、拡張機能のホワイトリストにモジュールを追加するだけで完全に機能します。
iFreilicht 2017年

39

pylintの最近のバージョンでは--extension-pkg-whitelist=numpy、pylintコマンドに追加できます。彼らは以前のバージョンでこの問題を危険な方法で修正していました。ここで、標準ライブラリの外部にあるパッケージを注意深く見てもらいたい場合は、明示的にホワイトリストに登録する必要があります。こちらをご覧ください。


2
「ここを参照」リンクは無効です。ソリューションはまだ機能していますが、なぜか理解するのが難しいです。リンクされた問題からの抜粋を追加するとよいでしょう。
GergelyPolonkai 2017年

「ここを見る」リンクが修正されました(現在はgithubの同じ問題を参照しています)
David Clarke

モジュールやパッケージでは機能するようですが、クラス名では機能しないようです。
イアンA.メイソン

17

これはグーグルのトップ結果であり、すべてのファイルでこれらの警告を無視する必要があるという印象を与えたので:

問題は先月、パイリント/アストロイドのソースで修正されました 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水銀を必要とします。


新しいlogilab / commonを複製する必要はありませんが、新しいlogilab / astroidをインストールする必要があると思います。logilab / astroidとlogilab / pylintを再インストールすることで、バグを解決できます。
paugier 14

7
どのバージョンを使用していますか?私はアストロイド1.3.2上だと1.4.0をpylintと私はまだ、このコードの問題を取得 from numpy import ceilしてその結果E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) 、私は上記の参照コミットチェックし、これらの変更は、私が持っているアストロイドのバージョンであることが表示されます。
Zach Dwiel 2014年

2
Xubuntu 14.04で提案されたとおり正確に実行され、これにより非機能のピリントが発生しました:py2.7.egg / pylint / lint.py "、行866、check_astroid_module astroid.close()AttributeError: 'Module' object has no attribute ' close '
bli

3
おそらくこれは退行です-問題を修正するためのリリースがあったようです。どちらの方法でも、bitbucket.org
logilab /

4
どうやらこれはまだpylint 1.4.2で修正されていない、アストロイド1.3.4: Module 'numpy' has no 'zeros' member (no-member)
ビル・

12

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など


を使用するときに同じ問題が発生しましたpatsy.dmatrices。追加するとgenerated-members=patsy.dmatrices私の問題は解決しました。
JonasDahlbæk、2018年

12

設定を追加したくない場合は、「ホワイトリスト」ではなく、このコードを設定ファイルに追加してください。

{
"python.linting.pylintArgs": ["--generate-members"],
}

9
これはVSコードに特に当てはまることを述べておく必要があります。
bers

出力されますpylint: error: no such option: --generate-members
Spaceship222

8

過去数年間、これについて多くの異なるバグが報告されています。すなわち、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

10
私はnumpyを非常に多く使用しているため、ファイル全体で非メンバーチェックを無効にすることもできますが、それは避けたいです。
Alphadelta14

2
-1 @bijancnの回答がこれに取って代わるべきだからです。
LondonRob 2014

@LondonRobはそうではありません。1.4.2にはまだ問題があります。paduwanのソリューションは、コードにハッククルーフトを追加する必要がないという点で優れています。
naught101

7

おそらく、それはnumpyのメソッドインポートのabstruseメソッドと混同されています。つまり、zeros実際には、numpy.core.multiarray.zerosステートメントでnumpyにインポートされます

from .core import *

次にインポート

from .numeric import *

そして数値であなたは見つけるでしょう

zeros = multiarray.zeros

PyLintの代わりに混乱すると思います!

PyLintの側面については、このバグを参照してください。


そのような単一のメソッドをインポートできればいいのですが、あまりにも多くの関数を使用しているので、インポートが非常に面倒になります。
Alphadelta14 2013

@ Alphadelta14それらすべてを見つけることさえ、巨大な混乱になるでしょう。私の回答の最後にあるリンクの提案を参照してください。
alko

2
そのSOリンクにより、PyLintは一部のモジュールのインポートを無視します。私はそれがそれらのファイルのメンバーでないエラーを抑制するかどうかはわかりません。また、できればPyLintにパッチを当てることは避けたいと思います。
Alphadelta14 2013

@ Alphadelta14 PyLintへのパッチを待つ必要があると思います。
alko

4

numpyを頻繁に使用するファイルの先頭にこれを追加する必要がありました。

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

日食の誰かがPydevとpylintで問題を抱えている場合に備えて...


4

Extension to j_hougs answerでは、問題のモジュールを.pylintrcのこの行に追加できます。これは、生成時にすでに空で準備されています。

extension-pkg-whitelist=numpy

次のようにして、サンプル.pylintrcを生成できます。

pylint --generate-rcfile > .pylintrc

次に、上記の行を編集します


4

これはPylint 1.8.2でようやく解決されました。そのまま使用でき、pylintrcの微調整は必要ありません。


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_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関連するすべてのインポートが一度にすべて実行される単一のモジュールがあり、その単一行を使用して、どこにでもインポートできることです。それでも、これらのエラーはPylintによってキャッチされnumpy_importerないため、存在しない名前をインポートしないように注意する必要numpyがあります。


2

私はnumpy、scipy、sklearn、nipyなどでこの問題があり、epylintを次のようにラップすることで解決しました。

$猫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へのリンクです。これが誰かに役立つことを願っています。



2

この解決策は私のために働いた

基本的に、左下から歯車アイコンを選択する=>設定=>ワークスペース設定=>拡張機能=> Python設定=>任意のSettings.jsonをクリック=>これを「python.linting.pylintArgs」ファイルに追加します:[" --extension-pkg-whitelist = numpy "]私はVS 1.27.2を使用しています


2

kivy.propertiesようなラップされたCモジュールである別のモジュール()でも同じ問題が発生しましたnumpy

VSCode V1.38.0を使用して、承認されたソリューションはプロジェクトのすべてのリンティングを停止しました。したがって、実際には誤検知は削除されましたが、実際にno-name-in-moduleは状況は改善されませんでした。

私にとって最良の回避策は--ignored-modules、問題のモジュールで引数を使用することでした。問題は、引数を渡しpython.linting.pylintArgsデフォルトのVSCode設定を消去するため、それらも再設定する必要があることです。これにより、次の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"
    ]
}

"python.linting.pylintArgs":["--generate-members = kivy.properties"]
yee

1

何が機能しているかを要約するための、前の回答からのコピーペースト(少なくとも私にとっては:debian-jessie)

  1. 一部の古いバージョンでpylintは、numpy(および他の同様のパッケージ)での動作を妨げる問題がありました。

  2. これで問題は解決しましたが、外部のCパッケージ(CコードへのPythonインターフェース-numpyなど)は、セキュリティ上の理由からデフォルトで無効になっています。

  3. ホワイトリストを作成pylintして、ファイルで使用できるようにすることができます~/.pylintrc

実行する基本的なコマンド:#ホームに.pylintrcファイルがない場合のみ$ pylint --generate-rcfile> .pylintrc

次に、ファイルを開き、必要なパッケージをextension-pkg-whitelist=カンマで区切って追加します。オプションを使用して同じ動作をすることができます--extension-pkg-whitelist=numpyコマンドラインの。

[TYPECHECK]セクションの一部のパッケージを無視pylintすると、そのパッケージに関連するエラーが表示されなくなります。実際にpylintは、これらのパッケージについては何も教えません。


0

numpyなどのライブラリの動的メンバーに関する問題を解決するために、pylintへのパッチに取り組んでいます。モジュールの実際のインポートを行うことにより、実行時にメンバーが存在するかどうかを強制的にチェックする「dynamic-modules」オプションを追加します。logilab / pylintのIssue#413を参照してください。プルリクエストもあります。コメントのリンクを参照してください。


これがpydevがそれを解決する方法です(ロードインスペクトするモジュールの特別なリスト)。その調子はどうですか?
Epu

0

簡単な回答:Pylintを1.7.1に更新します(condaを使用してパッケージを管理する場合は、conda-forge提供のPylint 1.7.1を使用してください)

ここpylint GitHubで同様の問題を発見し、1.7.1にアップデートした後、誰かがすべてがOKになると返信しました。


0

これが解決策かどうかはわかりませんが、VSCodeでユーザー設定に明示的に記述してpylintを有効にすると、すべてのモジュールが認識されました。

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}

0

最近(spyderまたはpylintまたは何かで何かが変更されたため)、astropy.constantsシンボルに対するspyderの静的コード分析からE1101エラー(「メンバーなし」)が発生しています。なぜだかわかりません。

LinuxまたはUnixシステム(Macはおそらく似ている)のすべてのユーザーに対する私の単純な解決策は、次のように/ etc / pylintrcを作成することです。

[TYPECHECK]
ignored-modules=astropy.constants

もちろん、代わりに、これを個人の$ HOME / .pylintrcファイルに入れることもできます。また、既存のファイルを更新することもできました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.