Wie bringe ich PyLint dazu, numpy Mitglieder zu erkennen?

163

Ich führe PyLint in einem Python-Projekt aus. PyLint beschwert sich häufig darüber, dass keine numpy Mitglieder gefunden werden können. Wie kann ich dies vermeiden und gleichzeitig vermeiden, Mitgliedschaftsprüfungen zu überspringen?

Aus dem Code:

import numpy as np

print np.zeros([1, 4])

Was ich beim Laufen erwarte:

[[0. 0. 0. 0.]]

Pylint gibt mir jedoch diesen Fehler:

E: 3, 6: Modul 'numpy' hat kein 'Nullen'-Mitglied (kein Mitglied)

Für Versionen verwende ich Pylint 1.0.0 (Astroid 1.0.1, Common 0.60.0) und versuche, mit Numpy 1.8.0 zu arbeiten.

Alphadelta14
quelle

Antworten:

75

Wenn Sie Visual Studio Code mit Don Jayamannes hervorragender Python-Erweiterung verwenden , fügen Sie der Whitelist numpy eine Benutzereinstellung hinzu:

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}
David Clarke
quelle
2
Das hat geholfen! unter VSCode 1.12.2 bestätigt, dass es unter Windows 10 x64 funktioniert.
Simara
8
Ich brauchte mehr: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter
2
Die Lösung von @Peter funktioniert unter Windows 7 x64 und Visual Studio Code 1.15.1 !!
BSP
3
@BSP Peters Beitrag löst das Problem nicht, er ignoriert es. Wenn ich diesen Kommentar ablehnen könnte, würde ich ..
Jonathan H
4
Mit Pylint 2.3.0 funktioniert das bei mir nicht mehr.
Guillochon
58

Ich hatte das gleiche Problem hier, auch mit den neuesten Versionen aller zugehörigen Pakete ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

Die folgende Lösung hat wie ein Zauber funktioniert: Ich numpyhabe die Liste der ignorierten Module durch Ändern meiner pylintrcDatei im [TYPECHECK]Abschnitt erweitert:

[TYPECHECK]

ignored-modules = numpy

Abhängig vom Fehler müssen Sie möglicherweise auch die folgende Zeile hinzufügen (noch in [TYPECHECK] section):

ignored-classes = numpy
Paduwan
quelle
2
Unter Linux mit Pylint 1.4.4, Astroid 1.3.8 und Python 3.4.3 funktionierte dies, aber ich musste die extension-pkg-whitelist=numpyZeile unter die [MASTER]Überschrift der .pylintrc-Datei setzen. pylint scheint eine ziemlich spröde Software zu sein und erfordert die Berührung eines Experten, damit sie für grundlegende Aufgaben funktioniert.
Eric Leschinski
12
Dies ist keine gute Lösung. Alles, was es tut, ist die Pylint-Überprüfung auf die Existenz von Mitgliedern vollständig zu deaktivieren. Idealerweise möchten Sie, dass es sie richtig erkennt, was auch die anderen Lösungen tun.
iFreilicht
1
@iFreilicht Es ist eine Sicherheitsmaßnahme. Zur Laufzeit können sich Moduldefinitionen dynamisch ändern. Um dies in Pylint zu aktivieren, müsste jedoch beliebiger Code ausgeführt werden. Trotzdem würde ich in der Antwort noch eine Art Notiz erwarten --extension-pkg-whitelist, die tatsächlich den Import für das angegebene Modul ausführt.
Zev Spitz
42

Ich bekam den gleichen Fehler für ein kleines Numpy-Projekt, an dem ich arbeitete, und entschied, dass das Ignorieren der Numpy-Module in Ordnung wäre. Ich habe eine .pylintrcDatei erstellt mit:

$ pylint --generate-rcfile > ~/.pylintrc

und nach den Ratschlägen von Paduwan und j_houg habe ich die folgenden Sektoren modifiziert:

[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

und

[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

und es "behoben" mein Problem.

lmount
quelle
6
Sind Sie sicher, dass Sie es auch zu den beiden ignored-*Eingängen hinzufügen mussten ? Für mich funktioniert das Hinzufügen eines Moduls zur Whitelist der Erweiterung perfekt.
iFreilicht
39

In neueren Versionen von pylint können Sie --extension-pkg-whitelist=numpyIhrem pylint-Befehl hinzufügen . Sie hatten dieses Problem in einer früheren Version auf unsichere Weise behoben. Wenn Sie nun möchten, dass sie ein Paket außerhalb der Standardbibliothek genauer betrachten, müssen Sie es explizit auf die Whitelist setzen. Siehe hier.

j_houg
quelle
2
Der Link "Hier sehen" ist tot. Die Lösung funktioniert immer noch, es ist nur schwer zu verstehen, warum. Es wäre schön, einen Auszug aus dem verknüpften Thema hinzuzufügen.
GergelyPolonkai
Der Link "Siehe hier" wurde behoben (verweist jetzt auf dasselbe Problem in Github)
David Clarke
Scheint, als würde es für Module und Pakete funktionieren, aber nicht für Klassennamen.
Ian A. Mason
17

Da dies das Top-Ergebnis in Google ist und ich den Eindruck hatte, dass Sie diese Warnungen in allen Dateien ignorieren müssen:

Das Problem wurde im letzten Monat in den Quellen von Pylint / Astroid https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e behoben , befindet sich jedoch noch nicht in den Ubuntu-Paketen.

Um die Quellen zu bekommen, einfach

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

wobei der letzte Schritt höchstwahrscheinlich ein erfordert sudound Sie natürlich Quecksilber benötigen, um zu klonen.

bijancn
quelle
Ich würde sagen, dass Sie das neue Logilab / Common nicht klonen müssen, sondern das neue Logilab / Astroid installieren müssen. Durch die Neuinstallation von Logilab / Astroid und Logilab / Pylint wird der Fehler für mich behoben.
paugier
7
Welche Versionen benutzt ihr? Ich bin auf astroid 1.3.2 und 1.4.0 Pylint und ich immer noch das Problem mit diesem Code erhalten from numpy import ceilErgebnisse in E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) I commit verwiesen oben geprüft und es scheint , dass diese Änderungen in der Version von astroid sind ich habe.
Zach Dwiel
2
Hat genau das getan, was in Xubuntu 14.04 vorgeschlagen wurde, und dies führte zu einem nicht funktionierenden Pylint: py2.7.egg / pylint / lint.py ", Zeile 866, in check_astroid_module astroid.close () AttributeError: 'Modul'-Objekt hat kein Attribut' schließen '
bli
3
Vielleicht ist dies eine Regression - es scheint eine Version gegeben zu haben, die das Problem beheben soll. In jedem Fall habe ich eine neue Ausgabe darüber unter bitbucket.org/logilab/pylint/issue/453/…
dstromberg
4
Anscheinend ist dies in Pylint 1.4.2, Astroid 1.3.4 immer noch nicht behoben: Module 'numpy' has no 'zeros' member (no-member)
Bill
12

Um alle Fehler zu ignorieren, die durch die Attribute von numpy.core generiert wurden, können wir jetzt Folgendes verwenden:

$ pylint a.py --generated-members=numpy.*

Fügen Sie als weitere Lösung diese Option zur Datei ~ / .pylintrc oder / etc / pylintrc hinzu :

[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.*

Für den im Fragencode bereits erwähnten Code scheint dies redundant zu sein, ist aber für andere Module immer noch wichtig, d. H. netifaces und etc.

Spatz
quelle
Ich hatte das gleiche Problem bei der Verwendung patsy.dmatrices. Hinzufügen hat generated-members=patsy.dmatricesmein Problem gelöst.
Jonas Dahlbæk
12

Wenn Sie keine weitere Konfiguration hinzufügen möchten, fügen Sie diesen Code anstelle von "Whitelist" zu Ihrer Konfigurationsdatei hinzu.

{
"python.linting.pylintArgs": ["--generate-members"],
}
lai_bluejay
quelle
9
Sie sollten erwähnen, dass dies sehr speziell für VS-Code gilt.
Bers
Es wird ausgegebenpylint: error: no such option: --generate-members
Raumschiff222
8

In den letzten Jahren wurden viele verschiedene Fehler gemeldet, z. B. https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Ich würde vorschlagen, die Leitungen zu deaktivieren, in denen die Beschwerden auftreten.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103
fliegend
quelle
10
Ich benutze numpy so oft, dass ich genauso gut die No-Member-Prüfung in der gesamten Datei deaktivieren könnte, aber ich möchte das vermeiden.
Alphadelta14
2
-1 Nur weil die Antwort von @ bijancn diese jetzt ersetzen sollte.
LondonRob
@ LondonRob tut es aber nicht. Problem besteht immer noch in 1.4.2. Die Lösung von paduwan ist insofern besser, als Sie Ihrem Code keine Hacky Cruft hinzufügen müssen.
naught101
7

Wahrscheinlich ist es mit der abstrusen Methode des Methodenimports von numpy verwechselt. Das heißt, zerosin der Tat numpy.core.multiarray.zeros, mit Aussage in numpy importiert

from .core import *

wiederum importiert mit

from .numeric import *

und in numerischen finden Sie

zeros = multiarray.zeros

Ich denke, ich wäre anstelle von PyLint verwirrt!

Siehe diesen Fehler für die PyLint-Seite.

alko
quelle
Ich wünschte, ich könnte nur einzelne Methoden wie diese importieren, aber ich verwende viel zu viele Funktionen und es würde die Importe zu einem großen Durcheinander machen.
Alphadelta14
@ Alphadelta14 Es wäre ein großes Durcheinander, alle zu finden. Siehe Vorschlag im Link am Ende meiner Antwort.
Alko
2
Diese SO-Verknüpfung lässt PyLint das Importieren einiger Module ignorieren. Ich bin mir nicht so sicher, ob dadurch Fehler ohne Mitglieder für diese Dateien unterdrückt werden. Ich möchte auch vermeiden, meine PyLint zu patchen, wenn dies überhaupt möglich ist.
Alphadelta14
@ Alphadelta14 Ich denke, du solltest dann auf einen Patch für PyLint warten.
alko
4

Ich musste dies oben in jede Datei einfügen, in der ich häufig numpy verwende.

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

Nur für den Fall, dass jemand in Eclipse Probleme mit Pydev und Pylint hat ...

jakebrinkmann
quelle
4

In der Antwort Erweiterung zu j_hougs können Sie nun die betreffenden Module zu dieser Zeile in .pylintrc hinzufügen, die bereits bei der Generierung leer vorbereitet ist:

extension-pkg-whitelist=numpy

Sie können ein Beispiel für .pylintrc generieren, indem Sie Folgendes tun:

pylint --generate-rcfile > .pylintrc

und bearbeiten Sie dann die genannte Zeile

Transistor
quelle
4

Dies wurde schließlich in Pylint 1.8.2 behoben. Funktioniert sofort, es sind keine Pylintrc-Optimierungen erforderlich!

Tomi Aarnio
quelle
3

Dies ist die Pseudolösung, die ich für dieses Problem gefunden habe.

#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

Dann in Ihrem Code, statt Aufruf numpyFunktionen wie np.arrayund np.zerosund so weiter, würden Sie schreiben np_array, np_zerosetc. Vorteile dieses Ansatzes gegenüber anderen Ansätzen in anderen Antworten vorgeschlagen:

  • Das Deaktivieren / Aktivieren von Pylint ist auf einen kleinen Bereich Ihres Codes beschränkt
  • Das bedeutet, dass Sie nicht jede einzelne Zeile, die eine Numpy-Funktion aufruft, mit einer Pylint-Direktive umgeben müssen.
  • Sie deaktivieren den Fehler nicht für Ihre gesamte Datei, wodurch andere Probleme mit Ihrem Code möglicherweise maskiert werden.

Der klare Nachteil ist, dass Sie jede von Ihnen verwendete Numpy-Funktion explizit importieren müssen. Der Ansatz könnte weiter ausgearbeitet werden. Sie können Ihr eigenes Modul numpy_importerwie folgt definieren

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

Dann könnte Ihr Anwendungscode dieses Modul nur (anstelle von numpy) als importieren

import numpy_importer as np 

und verwenden Sie die Namen wie immer: np.zeros, np.arrayusw.

Dies hat den Vorteil, dass Sie über ein einziges Modul verfügen, in dem alle numpyzugehörigen Importe ein für alle Mal ausgeführt werden. Anschließend importieren Sie es mit dieser einzelnen Zeile, wo immer Sie möchten. Sie müssen jedoch darauf achten, dass numpy_importerkeine Namen importiert werden, in numpydenen sie nicht vorhanden sind, da diese Fehler nicht von Pylint abgefangen werden.

Mateo
quelle
2

Ich hatte dieses Problem mit Numpy, Scipy, Sklearn, Nipy usw. und löste es, indem ich Epylint wie folgt einwickelte:

$ cat 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 __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,

Dieses Skript führt einfach Epylint aus und kratzt dann seine Ausgabe, um falsch positive Warnungen und Fehler herauszufiltern. Sie können es erweitern, indem Sie weitere elif-Fälle hinzufügen.

NB: Wenn dies auf Sie zutrifft, möchten Sie Ihre pychechers.sh so ändern, dass es Ihnen gefällt

#!/bin/bash

epylint.py "$1" 2>/dev/null
pyflakes "$1"
pep8 --ignore=E221,E701,E202 --repeat "$1"
true

(Natürlich müssen Sie zuerst epylint.py ausführbar machen.)

Hier ist ein Link zu meinen .emacs https://github.com/dohmatob/mydotemacs . Hoffe das ist nützlich für jemanden.

Dohmatob
quelle
2

Dies scheint mindestens bei Pylint 1.1.0 zu funktionieren:

[TYPECHECK]

ignored-classes=numpy
Tomi Aarnio
quelle
2

Diese Lösung hat bei mir funktioniert

Gehen Sie grundsätzlich zu Wählen Sie das Zahnradsymbol unten links aus => Einstellung => Arbeitsbereichseinstellung => Erweiterung => Python-Konfiguration => Klicken Sie auf eine Einstellung.json => fügen Sie diese in die Datei "python.linting.pylintArgs" ein: [" --extension-pkg-whitelist = numpy "] Ich verwende VS 1.27.2

Sanjeev Singh Kenwar
quelle
2

Ich hatte das gleiche Problem mit einem anderen Modul ( kivy.properties), das ein umschlossenes C-Modul ist numpy.

Mit VSCode V1.38.0 hat die akzeptierte Lösung alle Flusen für das Projekt gestoppt. Während es zwar das Falsch-Positive entfernte no-name-in-module, verbesserte es die Situation nicht wirklich.

Die beste Problemumgehung für mich war, das --ignored-modulesArgument für das betreffende Modul zu verwenden. Das Problem besteht darin, dass durch Übergeben eines Arguments python.linting.pylintArgsdie Standard-VSCode-Einstellungen gelöscht werden. Daher müssen Sie diese ebenfalls zurücksetzen . Damit blieb mir die folgende Datei 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"
    ]
}
Mikah Barnett
quelle
"python.linting.pylintArgs": ["--generate-members = kivy.properties"]
yee
1

Ein bisschen Kopieren und Einfügen aus der vorherigen Antwort, um zusammenzufassen, was funktioniert (zumindest für mich: debian-jessie)

  1. In einigen älteren Versionen pylintgab es ein Problem, das die Arbeit mit numpy (und anderen ähnlichen Paketen) verhinderte.

  2. Jetzt wurde dieses Problem behoben, aber externe C-Pakete (Python-Schnittstellen zu C-Code-like numpy-) sind aus Sicherheitsgründen standardmäßig deaktiviert.

  3. Sie können eine weiße Liste erstellen, um pylintsie in der Datei verwenden zu können ~/.pylintrc.

Grundlegender Befehl zum Ausführen: # NUR, wenn Sie noch keine .pylintrc-Datei in Ihrem Home haben. $ Pylint --generate-rcfile> .pylintrc

Öffnen Sie dann die Datei und fügen Sie die gewünschten Pakete hinzu, nachdem Sie extension-pkg-whitelist=durch Komma getrennt haben. Sie können dasselbe Verhalten mit der Option --extension-pkg-whitelist=numpyin der Befehlszeile erzielen.

Wenn Sie einige Pakete in diesem [TYPECHECK]Abschnitt ignorieren , bedeutet dies, dass pylintniemals Fehler in Bezug auf diese Pakete angezeigt werden. In der Praxis pylintwird Ihnen nichts über diese Pakete erzählen.

Riccardo Petraglia
quelle
0

Ich habe an einem Patch für pylint gearbeitet, um das Problem mit dynamischen Mitgliedern in Bibliotheken wie numpy zu lösen. Es wird eine Option "Dynamische Module" hinzugefügt, mit der überprüft werden muss, ob zur Laufzeit Mitglieder vorhanden sind, indem das Modul wirklich importiert wird. Siehe Problem Nr . 413 in logilab / pylint . Es gibt auch eine Pull-Anfrage, siehe Link in einem der Kommentare.

Zarek Tomczak
quelle
So löst Pydev das Problem (eine spezielle Liste von Modulen, die geladen werden müssen). Wie läuft diese Arbeit?
Epu
0

Eine schnelle Antwort: Aktualisieren Sie Pylint auf 1.7.1 (verwenden Sie das von conda-forge bereitgestellte Pylint 1.7.1, wenn Sie conda zum Verwalten von Paketen verwenden).

Ich habe hier ein ähnliches Problem in pylint GitHub gefunden und jemand hat geantwortet, dass nach dem Update auf 1.7.1 alles in Ordnung ist.

Leon
quelle
0

Ich bin nicht sicher, ob dies eine Lösung ist, aber in VSCode wurden alle Module erkannt, nachdem ich explizit in meinen Benutzereinstellungen geschrieben habe, um Pylint zu aktivieren.

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

In letzter Zeit (seit sich etwas in Spyder oder Pylint oder? Geändert hat) habe ich E1101-Fehler ("kein Mitglied") durch die statische Code-Analyse von Spyder auf astropy.constants-Symbolen erhalten. Keine Ahnung warum.

Meine vereinfachende Lösung für alle Benutzer auf einem Linux- oder Unix-System (Mac ist wahrscheinlich ähnlich) besteht darin, ein / etc / pylintrc wie folgt zu erstellen:

[TYPECHECK]
ignored-modules=astropy.constants

Dies könnte natürlich stattdessen in eine persönliche $ HOME / .pylintrc-Datei eingefügt werden. Und ich hätte eine vorhandene Datei aktualisieren können.

Richard Elkins
quelle