Come faccio a far riconoscere a PyLint i membri numpy?


163

Sto eseguendo PyLint su un progetto Python. PyLint si lamenta per non essere in grado di trovare membri intorpiditi. Come posso evitarlo evitando di saltare i controlli di iscrizione.

Dal codice:

import numpy as np

print np.zeros([1, 4])

Che, quando eseguito, ottengo l'atteso:

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

Tuttavia, pylint mi dà questo errore:

E: 3, 6: il modulo 'numpy' non ha membri 'zeri' (nessun membro)

Per le versioni, sto usando pylint 1.0.0 (astroid 1.0.1, comune 0.60.0) e sto cercando di lavorare con numpy 1.8.0.

Risposte:


75

Se si utilizza Visual Studio Code con l'eccellente estensione Python di Don Jayamanne , aggiungere un'impostazione utente alla whitelist numpy:

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

2
Questo ha aiutato! sul VSCode 1.12.2 ha confermato che funziona su Windows 10 x64.
Simara,

8
Avevo bisogno di più: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter

2
La soluzione di @Peter funziona in Windows 7 x64 e Visual Studio Code 1.15.1 !!
BSP,

3
@BSP Il post di Peter non risolve il problema, lo ignora. Se potessi sottovalutare questo commento, vorrei ...
Jonathan H

4
Questo non funziona più per me con Pylint 2.3.0.
Guillochon,

58

Ho avuto lo stesso problema qui, anche con le ultime versioni di tutti i pacchetti correlati ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

La seguente soluzione ha funzionato come un incantesimo: ho aggiunto numpyall'elenco dei moduli ignorati modificando il mio pylintrcfile, nella [TYPECHECK]sezione:

[TYPECHECK]

ignored-modules = numpy

A seconda dell'errore, potresti anche dover aggiungere la seguente riga (sempre nella [TYPECHECK] section):

ignored-classes = numpy

2
Su Linux con pylint 1.4.4, astroid 1.3.8 e Python 3.4.3, questo ha funzionato, ma ho dovuto mettere la extension-pkg-whitelist=numpylinea sotto l' [MASTER]intestazione del file .pylintrc. pylint sembra essere un software abbastanza fragile e richiede il tocco di un esperto per farlo funzionare per le attività di base.
Eric Leschinski,

12
Questa non è una buona soluzione. Tutto ciò che fa è disabilitare completamente il controllo del pylint per l'esistenza di eventuali membri. Idealmente, vorresti che li riconoscesse correttamente, che è quello che fanno le altre soluzioni.
iFreilicht,

1
@iFreilicht È una misura di sicurezza. In fase di esecuzione, le definizioni dei moduli possono cambiare in modo dinamico; ma abilitarlo in pylint implicherebbe l'esecuzione di codice arbitrario. Tuttavia mi aspetterei ancora una sorta di nota nella risposta su --extension-pkg-whitelist, che in realtà esegue l'importazione per il modulo specificato.
Zev Spitz,

43

Stavo ottenendo lo stesso errore per un piccolo progetto intorpidito a cui stavo lavorando e ho deciso che ignorare i moduli intorpiditi sarebbe andato bene. Ho creato un .pylintrcfile con:

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

e seguendo i consigli di paduwan e j_houg ho modificato i seguenti settori:

[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

e

[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

e ha "risolto" il mio problema.


6
Sei sicuro di doverlo aggiungere anche ai due ignored-*ingressi? Per me, l'aggiunta di un modulo alla whitelist di estensione funziona perfettamente.
iFreilicht,

39

Nelle versioni recenti di pylint è possibile aggiungere --extension-pkg-whitelist=numpyal comando pylint. Avevano risolto questo problema in una versione precedente in modo non sicuro. Ora, se si desidera che guardino più attentamente un pacchetto esterno alla libreria standard, è necessario autorizzarlo esplicitamente. Vedere qui.


2
Il link "Vedi qui" è morto. La soluzione funziona ancora, è difficile (ehm) capire perché. Sarebbe bello aggiungere un estratto dal problema collegato.
GergelyPolonkai,

Il link "Vedi qui" è stato corretto (ora fa riferimento allo stesso problema in github)
David Clarke,

Sembra che funzioni per moduli e pacchetti ma non per i nomi di classe.
Ian A. Mason,

17

Poiché questo è il miglior risultato in google e mi ha dato l'impressione che devi ignorare quegli avvisi in tutti i file:

Il problema è stato effettivamente risolto nelle fonti di pylint / astroid il mese scorso https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e ma non sono ancora nei pacchetti Ubuntu.

Per ottenere le fonti, giusto

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

per cui l'ultimo passaggio molto probabilmente richiederà un sudoe, naturalmente, è necessario clonare mercurial.


Direi che non è necessario clonare il nuovo logilab / common ma che è necessario installare il nuovo logilab / astroid. Reinstalla logilab / astroid e logilab / pylint, risolve il bug per me.
paugier,

7
Quali versioni state usando? Sono su astroid 1.3.2 e 1.4.0 pylint e ho ancora il problema con questo codice from numpy import ceilrisultati nel E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) Ho controllato il commesso di cui sopra e sembra che questi cambiamenti sono nella versione di astroid ho.
Zach Dwiel,

2
Ha fatto esattamente come suggerito su Xubuntu 14.04 e questo ha provocato un pilone non funzionante: py2.7.egg / pylint / lint.py ", riga 866, in check_astroid_module astroid.close () AttributeError: l'oggetto 'Modulo' non ha attributi ' chiudi '
bli

3
Forse questa è una regressione - sembra che ci sia stata una versione destinata a risolvere il problema. Ad ogni modo, ho aperto un nuovo numero al riguardo su bitbucket.org/logilab/pylint/issue/453/…
dstromberg

4
Apparentemente questo non è ancora stato risolto nel pilastro 1.4.2, astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Bill

12

Per ignorare tutti gli errori generati dagli attributi numpy.core, ora possiamo usare:

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

Come altra soluzione, aggiungi questa opzione al file ~ / .pylintrc o / 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.*

Per quanto menzionato nel codice della domanda ormai questo sembra ridondante, ma è ancora importante per altri moduli, vale a dire. netifaces ed ecc.


Ho avuto lo stesso problema durante l'utilizzo patsy.dmatrices. L'aggiunta ha generated-members=patsy.dmatricesrisolto il mio problema.
Jonas Dahlbæk,

12

Se non desideri aggiungere altre configurazioni, aggiungi questo codice al tuo file di configurazione, anziché "whitelist".

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

9
Dovresti dire che questo si applica in modo molto specifico al Codice VS.
bers

Uscita Saràpylint: error: no such option: --generate-members
Spaceship222

8

Negli ultimi anni sono stati segnalati molti bug diversi, ad esempio https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Suggerirei di disabilitare per le righe in cui si verificano i reclami.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103

10
Uso numpy così tanto che potrei anche solo disabilitare il controllo di assenza di membro nell'intero file, tuttavia, voglio evitare di farlo.
Alphadelta14,

2
-1 Solo perché la risposta di @ bijancn dovrebbe ora sostituire questa.
LondonRob,

@LondonRob non lo fa. Il problema persiste ancora in 1.4.2. La soluzione di paduwan è migliore in quanto non richiede l'aggiunta di hacky cruft al tuo codice.
naught101

7

Probabilmente, è confuso con il metodo astruso dell'importazione dei metodi di numpy. Vale a dire, zerosè in effetti numpy.core.multiarray.zeros, importato in numpy con istruzione

from .core import *

a sua volta importato con

from .numeric import *

e in numerico lo troverai

zeros = multiarray.zeros

Immagino che sarei confuso al posto di PyLint!

Vedi questo bug per il lato di vista di PyLint.


Vorrei poter solo importare singoli metodi come quello, ma uso troppe funzioni e renderebbe le importazioni un casino enorme.
Alphadelta14

@ Alphadelta14 Sarebbe un gran casino persino trovarli tutti. Vedi il suggerimento nel link alla fine della mia risposta.
alko,

2
Quel collegamento SO fa sì che PyLint ignori l'importazione di alcuni moduli. Non sono così sicuro che lo farebbe sopprimere gli errori di nessun membro per quei file. Vorrei anche evitare di rattoppare il mio PyLint, se possibile.
Alphadelta14,

@ Alphadelta14 Immagino che dovresti aspettare una patch per PyLint.
alko,

4

Ho dovuto aggiungere questo nella parte superiore di qualsiasi file in cui uso parecchio numpy.

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

Nel caso in cui qualcuno in eclissi abbia problemi con Pydev e pylint ...


4

Nella risposta Extension to j_hougs, ora puoi aggiungere i moduli in questione a questa riga in .pylintrc, che è già pronto vuoto alla generazione:

extension-pkg-whitelist=numpy

puoi generare un campione .pylintrc facendo:

pylint --generate-rcfile > .pylintrc

e quindi modificare la riga menzionata


4

Questo è stato finalmente risolto in Pylint 1.8.2. Funziona immediatamente, senza modifiche al pilone!


3

Questa è la pseudo-soluzione che ho escogitato per questo problema.

#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

Poi, nel codice, invece di chiamare numpyfunzioni come np.arraye np.zerose così via, si può scrivere np_array, np_zerosecc I vantaggi di questo approccio rispetto ad altri approcci suggeriti in altre risposte:

  • La disabilitazione / abilitazione del pylint è limitata a una piccola area del codice
  • Ciò significa che non devi circondare ogni singola riga che ha una chiamata di una funzione numpy con una direttiva pylint.
  • Non si sta disabilitando pylint dell'errore per l'intero file, che potrebbe mascherare altri problemi con il codice.

Il chiaro svantaggio è che devi importare esplicitamente ogni funzione numpy che usi. L'approccio potrebbe essere ulteriormente elaborato. È possibile definire il proprio modulo, chiamarlo dire, numpy_importercome segue

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

Quindi, il codice dell'applicazione potrebbe importare solo questo modulo (anziché numpy) come

import numpy_importer as np 

e usare i nomi come al solito: np.zeros, np.arrayetc.

Il vantaggio di questo è che avrai un singolo modulo in cui tutte le numpyrelative importazioni vengono eseguite una volta per tutte, e poi lo importi con quella singola linea, ovunque tu voglia. Tuttavia devi stare attento a numpy_importernon importare nomi in cui non esistono in numpyquanto tali errori non verranno colti da Pylint.


2

Ho avuto questo problema con intorpidimento, scipy, sklearn, nipy, ecc. E l'ho risolto avvolgendo l'epilint in questo modo:

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

Questo script esegue semplicemente epylint, quindi ne elimina l'output per filtrare avvisi ed errori falsi positivi. Puoi estenderlo aggiungendo altri casi elif.

NB: Se questo è il tuo caso, ti consigliamo di modificare il tuo pychechers.sh in modo che gli piaccia così

#!/bin/bash

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

(Naturalmente, devi prima eseguire eseguibile epylint.py)

Ecco un link al mio .emacs https://github.com/dohmatob/mydotemacs . Spero che questo sia utile a qualcuno.


2

Questo sembra funzionare almeno su Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy

2

Questa soluzione ha funzionato per me

Fondamentalmente, vai a Seleziona l'icona a forma di ingranaggio in basso a sinistra => Impostazione => Impostazioni dell'area di lavoro => Estensione => Configurazione Python => Fai clic su qualsiasi Settings.json => aggiungi questo nel file "python.linting.pylintArgs": [" --extension-pkg-whitelist = numpy "] Sto usando VS 1.27.2


2

Ho avuto lo stesso problema con un modulo diverso ( kivy.properties) che è un modulo C avvolto come numpy.

Usando VSCode V1.38.0, la soluzione accettata ha fermato tutti gli sfilacciamenti per il progetto. Quindi, sebbene abbia effettivamente rimosso il falso positivo no-name-in-module, in realtà non ha migliorato la situazione.

La migliore soluzione per me era usare l' --ignored-modulesargomento sul modulo offensivo. Il problema è che passare qualsiasi argomento tramite python.linting.pylintArgscancella le impostazioni VSCode predefinite , quindi è necessario reimpostare anche quelle. Mi ha lasciato il seguente file 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

Un po 'di copia incolla dalla risposta precedente per riassumere ciò che funziona (almeno per me: debian-jessie)

  1. In alcune versioni precedenti pylintc'era un problema che gli impediva di funzionare con numpy (e altri pacchetti simili).

  2. Ora quel problema è stato risolto ma i pacchetti C esterni (interfacce Python al codice C -come numpy-) sono disabilitati di default per motivi di sicurezza.

  3. È possibile creare una lista bianca, per consentire pylintdi usarli nel file ~/.pylintrc.

Comando di base da eseguire: # SOLO se non si dispone già di un file .pylintrc nella propria home $ pylint --generate-rcfile> .pylintrc

Quindi apri il file e aggiungi i pacchetti che desideri dopo extension-pkg-whitelist=separati da una virgola. Puoi avere lo stesso comportamento usando l'opzione --extension-pkg-whitelist=numpydalla riga di comando.

Se ignori alcuni pacchetti nella [TYPECHECK]sezione, ciò significa che pylintnon mostrerà mai errori relativi a tali pacchetti. In pratica, pylintnon ti dirò nulla su quei pacchetti.


0

Ho lavorato su una patch per pylint per risolvere il problema con membri dinamici in librerie come Numpy. Aggiunge un'opzione "moduli dinamici" che impone di verificare l'esistenza di membri durante il runtime effettuando una vera importazione del modulo. Vedi il numero 413 in logilab / pylint . C'è anche una richiesta pull, vedi link in uno dei commenti.


Ecco come pydev lo risolve (un elenco speciale di moduli da caricare-ispezionare). Come va quel lavoro?
Epu,

0

Una risposta rapida: aggiorna Pylint alla 1.7.1 (usa conda-forge fornito Pylint 1.7.1 se usi conda per gestire i pacchetti)

Ho trovato un problema simile nel pylint GitHub qui e qualcuno ha risposto a tutto ottenendo OK dopo l'aggiornamento alla 1.7.1.


0

Non sono sicuro che questa sia una soluzione, ma in VSCode una volta che ho scritto esplicitamente nelle mie impostazioni utente per abilitare il pylint, tutti i moduli sono stati riconosciuti.

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

0

Ultimamente (da quando qualcosa è cambiato in spyder o pylint o?), Ho ricevuto errori E1101 ("nessun membro") dall'analisi del codice statico di spyder sui simboli astropy.constants. Non ho idea del perché.

La mia soluzione semplicistica per tutti gli utenti su un sistema Linux o Unix (il Mac è probabilmente simile) è quella di creare un / etc / pylintrc come segue:

[TYPECHECK]
ignored-modules=astropy.constants

Naturalmente, questo potrebbe, invece, essere inserito in un file $ HOME / .pylintrc personale. E avrei potuto aggiornare un file esistente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.