PythonプロジェクトでPyLintを実行しています。 PyLintは、numpyメンバーが見つからないことについて多くの苦情を述べています。メンバーシップチェックをスキップすることを避けながら、どうすればこれを回避できますか。
コードから:
import numpy as np
print np.zeros([1, 4])
実行すると、期待どおりになります:
[[0. 0. 0. 0.]]
ただし、pylintはこのエラーを表示します。
E:3、6:モジュール 'numpy'には 'zeros'メンバーがありません(非メンバー)
バージョンについては、pylint 1.0.0(アストロイド1.0.1、一般的な0.60.0)を使用し、numpy 1.8.0で作業しようとしています。
Visual Studio Code とDon Jayamanneの優れた Python拡張 を使用する場合、ユーザー設定をホワイトリストnumpyに追加します。
{
// whitelist numpy to remove lint errors
"python.linting.pylintArgs": [
"--extension-pkg-whitelist=numpy"
]
}
ここでは、関連するすべてのパッケージの最新バージョン(astroid 1.3.2
、logilab_common 0.63.2
、pylon 1.4.0
)でも同じ問題がありました。
次のソリューションは魅力のように機能しました。[TYPECHECK]
セクションでnumpy
ファイルを変更することで、無視されるモジュールのリストにpylintrc
を追加しました。
[TYPECHECK]
ignored-modules = numpy
エラーによっては、次の行も追加する必要があります([TYPECHECK] section
にまだあります)。
ignored-classes = numpy
Pylintの最近のバージョンでは、--extension-pkg-whitelist=numpy
をpylintコマンドに追加できます。彼らは以前のバージョンでこの問題を安全でない方法で修正していました。標準ライブラリ外のパッケージをもっと注意深く見たい場合は、明示的にホワイトリストに登録する必要があります。 こちらをご覧ください
私が取り組んでいる小さな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
そしてそれは私の問題を「修正」しました。
これはグーグルでの最高の結果であり、すべてのファイルでこれらの警告を無視する必要があるという印象を与えたので:
この問題は先月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が必要です。
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など.
過去数年にわたってこれについて多くの異なるバグが報告されています。つまり、 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
おそらく、それはnumpyのメソッドインポートの抽象メソッドと混同されています。つまり、zeros
は実際にはnumpy.core.multiarray.zeros
で、numpyでステートメントとともにインポートされます
from .core import *
順番にインポート
from .numeric import *
そして、あなたは見つけるでしょう
zeros = multiarray.zeros
PyLintの代わりに混乱するでしょう!
PyLintの側面については、 このバグ を参照してください。
Extension to j_hougs answerでは、問題のモジュールを.pylintrcのこの行に追加できます。これは、生成時にすでに空に準備されています。
extension-pkg-whitelist=numpy
以下を実行して、サンプルの.pylintrcを生成できます。
pylint --generate-rcfile > .pylintrc
そして、言及された行を編集します
これは、Pylint 1.8.2で最終的に解決されました。箱から出して動作し、pylintrcの調整は不要です!
Numpyを頻繁に使用するファイルの先頭にこれを追加する必要がありました。
# To ignore numpy errors:
# pylint: disable=E1101
Eclipseの誰かがPydevとpylintで問題を抱えている場合に備えて...
これは、この問題に対して私が思いついた疑似解決策です。
#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
関連のインポートが1回だけ実行される単一のモジュールがあり、その単一行でどこにでもインポートできることです。それでも、numpy_importer
は、numpy
に存在しない名前をインポートしないことに注意する必要があります。これらのエラーは、pylintによってキャッチされないためです。
これは少なくともPylint 1.1.0で動作するようです:
[TYPECHECK]
ignored-classes=numpy
構成を追加したくない場合は、「ホワイトリスト」ではなく、このコードを構成ファイルに追加してください。
{
"python.linting.pylintArgs": ["--generate-members"],
}
私は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 <[email protected]> <[email protected]>
"""
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 __== "__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 。これが誰かに役立つことを願っています。
何が機能しているかを要約するための前の回答からのコピーペースト(少なくとも私にとっては:debian-jessie)
pylint
の一部の古いバージョンでは、numpy(および他の同様のパッケージ)での動作を妨げる問題がありました。
これで問題は解決しましたが、外部のCパッケージ(numpyのようなCコードへのPythonインターフェイス)はセキュリティ上の理由からデフォルトで無効になっています。
ホワイトリストを作成して、pylint
がファイル~/.pylintrc
でそれらを使用できるようにすることができます。
実行する基本コマンド:#ホームに.pylintrcファイルがまだない場合のみ$ pylint --generate-rcfile> .pylintrc
次に、ファイルを開き、extension-pkg-whitelist=
の後にコンマで区切って必要なパッケージを追加します。コマンドラインからオプション--extension-pkg-whitelist=numpy
を使用して同じ動作をすることができます。
[TYPECHECK]
セクションの一部のパッケージを無視すると、pylint
はそのパッケージに関連するエラーを表示しなくなります。実際には、pylint
はそれらのパッケージについて何も通知しません。
このソリューションは私のために働いた
基本的に、左下から歯車アイコンを選択する=>設定=>ワークスペース設定=>拡張=> Python設定=>任意のSettings.jsonをクリックします。これをファイル「python.linting.pylintArgs」に追加します:[" --extension-pkg-whitelist = numpy "] VS 1.27.2を使用しています
簡単な答え:Pylintを1.7.1に更新します(condaを使用してパッケージを管理する場合、conda-forgeが提供するPylint 1.7.1を使用します)
pylint GitHub here で同様の問題を発見し、1.7.1にアップデートした後、誰かがすべてが正常になったと答えました。
最近(spyderまたはpylintまたは?で何かが変更されたため)、aspory.constantsシンボルに関するspyderの静的コード分析からE1101エラー(「メンバーなし」)が発生しました。理由はわかりません。
LinuxまたはUnixシステム(Macもおそらく似ている)上のすべてのユーザーに対する私の単純なソリューションは、次のように/ etc/pylintrcを作成することです。
[TYPECHECK]
ignored-modules=astropy.constants
もちろん、これは代わりに個人の$ HOME/.pylintrcファイルに入れることができます。また、既存のファイルを更新することもできました。
これが解決策かどうかはわかりませんが、VSCodeでユーザー設定で明示的に記述してpylintを有効にすると、すべてのモジュールが認識されました。
{
"python.linting.pep8Enabled": true,
"python.linting.pylintEnabled": true
}
私は、numpyなどのライブラリの動的メンバーに関する問題を解決するために、pylintのパッチに取り組んでいます。モジュールの実際のインポートを行うことにより、実行時にメンバーが存在するかどうかを強制的にチェックする「動的モジュール」オプションを追加します。 logilab/pylintの問題#41 を参照してください。プルリクエストもあります。いずれかのコメントのリンクを参照してください。