web-dev-qa-db-ja.com

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

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で作業しようとしています。

147
Alphadelta14

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

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

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

次のソリューションは魅力のように機能しました。[TYPECHECK]セクションでnumpyファイルを変更することで、無視されるモジュールのリストにpylintrcを追加しました。

[TYPECHECK]

ignored-modules = numpy

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

ignored-classes = numpy
54
paduwan

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

39
j_houg

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

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

38
lmount

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

この問題は先月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が必要です。

17
bijancn

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

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
7
flyingsolow

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

from .core import *

順番にインポート

from .numeric import *

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

zeros = multiarray.zeros

PyLintの代わりに混乱するでしょう!

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

6
alko

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

extension-pkg-whitelist=numpy

以下を実行して、サンプルの.pylintrcを生成できます。

pylint --generate-rcfile > .pylintrc

そして、言及された行を編集します

4
transistor

これは、Pylint 1.8.2で最終的に解決されました。箱から出して動作し、pylintrcの調整は不要です!

4
Tomi Aarnio

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

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

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

3
jakebrinkmann

これは、この問題に対して私が思いついた疑似解決策です。

#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などを記述します。このアプローチと他の回答で提案されている他のアプローチの利点:

  • パイリントの無効化/有効化は、コードの小さな領域に制限されています
  • これは、numpy関数を呼び出しているすべての行を、pylintディレクティブで囲む必要がないことを意味します。
  • ファイル全体に対してエラーの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関連のインポートが1回だけ実行される単一のモジュールがあり、その単一行でどこにでもインポートできることです。それでも、numpy_importerは、numpyに存在しない名前をインポートしないことに注意する必要があります。これらのエラーは、pylintによってキャッチされないためです。

3
Mateo

これは少なくともPylint 1.1.0で動作するようです:

[TYPECHECK]

ignored-classes=numpy
3
Tomi Aarnio

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

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

私は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 。これが誰かに役立つことを願っています。

2
dohmatob

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

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

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

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

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

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

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

1

このソリューションは私のために働いた

基本的に、左下から歯車アイコンを選択する=>設定=>ワークスペース設定=>拡張=> 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にアップデートした後、誰かがすべてが正常になったと答えました。

0
Leon

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

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

[TYPECHECK]
ignored-modules=astropy.constants

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

0
Richard Elkins

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

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

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

0
Czarek Tomczak