Comment faire en sorte que PyLint reconnaisse les membres numpy?

163

J'exécute PyLint sur un projet Python. PyLint se plaint de ne pas pouvoir trouver de membres numpy. Comment éviter cela tout en évitant de sauter les chèques d'adhésion.

À partir du code:

import numpy as np

print np.zeros([1, 4])

Qui, une fois exécuté, j'obtiens l'attendu:

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

Cependant, pylint me donne cette erreur:

E: 3, 6: Le module 'numpy' n'a pas de membre 'zeros' (pas de membre)

Pour les versions, j'utilise pylint 1.0.0 (astroid 1.0.1, commun 0.60.0) et j'essaie de travailler avec numpy 1.8.0.

Alphadelta14
la source

Réponses:

75

Si vous utilisez Visual Studio Code avec l'excellente extension Python de Don Jayamanne , ajoutez un paramètre utilisateur à la liste blanche numpy:

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}
David Clarke
la source
2
Cela a aidé! sur VSCode 1.12.2 a confirmé qu'il fonctionne sur Windows 10 x64.
Simara
8
J'avais besoin de plus: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter
2
La solution de @Peter fonctionnant sous Windows 7 x64 et Visual Studio Code 1.15.1 !!
BSP le
3
Le message de @BSP Peter ne résout pas le problème, il l'ignore. Si je pouvais voter contre ce commentaire, je le ferais ..
Jonathan H
4
Cela ne fonctionne plus pour moi avec pylint 2.3.0.
Guillochon
58

J'ai eu le même problème ici, même avec les dernières versions de tous les paquets associés ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

La solution suivante a fonctionné comme un charme: j'ai ajouté numpyà la liste des modules ignorés en modifiant mon pylintrcfichier, dans la [TYPECHECK]section:

[TYPECHECK]

ignored-modules = numpy

En fonction de l'erreur, vous devrez peut-être également ajouter la ligne suivante (toujours dans le [TYPECHECK] section):

ignored-classes = numpy
Paduwan
la source
2
Sous Linux avec pylint 1.4.4, astroid 1.3.8 et Python 3.4.3, cela a fonctionné, mais j'ai dû mettre la extension-pkg-whitelist=numpyligne sous l'en- [MASTER]tête du fichier .pylintrc. pylint semble être un logiciel assez fragile et nécessite une touche d'expert pour qu'il fonctionne pour les tâches de base.
Eric Leschinski
12
Ce n'est pas une bonne solution. Tout ce qu'il fait est de désactiver complètement la vérification de pylint pour l'existence de tous les membres. Idéalement, vous voudriez qu'il les reconnaisse correctement, ce que font les autres solutions.
iFreilicht
1
@iFreilicht C'est une mesure de sécurité. Au moment de l'exécution, les définitions de module peuvent changer dynamiquement; mais l'activer dans pylint impliquerait d'exécuter du code arbitraire. Néanmoins, je m'attendrais toujours à une sorte de note dans la réponse sur --extension-pkg-whitelist, qui effectue en fait l'importation pour le module spécifié.
Zev Spitz
43

J'obtenais la même erreur pour un petit projet numpy sur lequel je travaillais et j'ai décidé qu'ignorer les modules numpy ferait très bien. J'ai créé un .pylintrcfichier avec:

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

et suivant les conseils de paduwan et j_houg, j'ai modifié les secteurs suivants:

[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

et

[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

et il a "résolu" mon problème.

lmount
la source
6
Etes-vous sûr de devoir l'ajouter également aux deux ignored-*entrées? Pour moi, ajouter simplement un module à la liste blanche d'extension fonctionne parfaitement.
iFreilicht
39

Dans les versions récentes de pylint, vous pouvez ajouter --extension-pkg-whitelist=numpyà votre commande pylint. Ils avaient résolu ce problème dans une version antérieure de manière non sécurisée. Maintenant, si vous voulez qu'ils examinent plus attentivement un paquet en dehors de la bibliothèque standard, vous devez explicitement le mettre sur liste blanche. Vois ici.

j_houg
la source
2
Le lien «Voir ici» est mort. La solution fonctionne toujours cependant, il est juste difficile (euh) de comprendre pourquoi. Ce serait bien d'ajouter un extrait du problème lié.
GergelyPolonkai
Le lien "Voir ici" a été corrigé (fait désormais référence au même problème dans github)
David Clarke
On dirait que cela fonctionne pour les modules et les packages mais pas pour les noms de classe.
Ian A. Mason
17

Comme il s'agit du meilleur résultat de Google et que cela m'a donné l'impression que vous devez ignorer ces avertissements dans tous les fichiers:

Le problème a en fait été corrigé dans les sources de pylint / astroid le mois dernier https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e mais ne sont pas encore dans les packages Ubuntu.

Pour obtenir les sources, juste

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

grâce à quoi la dernière étape nécessitera très probablement un sudoet bien sûr vous aurez besoin de mercurial pour cloner.

bijancn
la source
Je dirais que vous n'avez pas besoin de cloner le nouveau logilab / common mais que vous devez installer le nouveau logilab / astroid. En réinstallant logilab / astroid et logilab / pylint, cela résout le bogue pour moi.
paugier
7
Quelles versions utilisez-vous? Je suis sur astroïde 1.3.2 et 1.4.0 pylint et je reçois toujours le problème avec ce code from numpy import ceilentraîne que E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) j'ai vérifié le commets référencé ci - dessus et il semble que ces changements sont dans la version de astroïde je.
Zach Dwiel
2
Fait exactement comme suggéré sur Xubuntu 14.04 et cela a abouti à un pylint non fonctionnel: py2.7.egg / pylint / lint.py ", ligne 866, dans check_astroid_module astroid.close () AttributeError: 'Module' object has no attribute ' fermer '
bli
3
C'est peut-être une régression - il semble y avoir eu une version destinée à résoudre le problème. Quoi qu'il en soit, j'ai ouvert un nouveau numéro à ce sujet sur bitbucket.org/logilab/pylint/issue/453/…
dstromberg
4
Apparemment, cela n'est toujours pas corrigé dans pylint 1.4.2, astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Bill
12

Pour ignorer toutes les erreurs générées par les attributs de numpy.core, nous pouvons désormais utiliser:

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

Comme autre solution, ajoutez cette option au fichier ~ / .pylintrc ou / 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.*

Pour le code mentionné dans la question maintenant, cela semble redondant, mais compte toujours pour un autre module, à savoir. netifaces et etc.

Spatz
la source
J'ai eu le même problème lors de l'utilisation patsy.dmatrices. L'ajout a generated-members=patsy.dmatricesrésolu mon problème.
Jonas Dahlbæk
12

Si vous ne voulez pas ajouter plus de configuration, veuillez ajouter ce code à votre fichier de configuration, au lieu de «liste blanche».

{
"python.linting.pylintArgs": ["--generate-members"],
}
lai_bluejay
la source
9
Vous devez mentionner que cela s'applique très spécifiquement à VS Code.
bers
Il sortirapylint: error: no such option: --generate-members
Spaceship222
8

De nombreux bugs différents ont été signalés à ce sujet au cours des dernières années, à savoir https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Je suggère de désactiver pour les lignes où les plaintes se produisent.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103
vol d'oiseau
la source
10
J'utilise tellement numpy que je pourrais tout aussi bien désactiver la vérification des non-membres dans tout le fichier, mais je veux éviter de le faire.
Alphadelta14
2
-1 Juste parce que la réponse de @ bijancn devrait maintenant remplacer celle-ci.
LondonRob
@LondonRob, ce n'est pas le cas. Le problème existe toujours dans la version 1.4.2. La solution de paduwan est meilleure en ce qu'elle ne nécessite pas l'ajout de piratage à votre code.
naught101
7

Probablement, il est confondu avec la méthode abstruse de numpy d'importation de méthodes. A savoir, zerosest en fait numpy.core.multiarray.zeros, importé en numpy avec instruction

from .core import *

à son tour importé avec

from .numeric import *

et en numérique, vous trouverez

zeros = multiarray.zeros

Je suppose que je serais confus à la place de PyLint!

Voir ce bogue pour le côté de vue PyLint.

alko
la source
J'aimerais pouvoir importer des méthodes uniques comme celle-là, mais j'utilise beaucoup trop de fonctions et cela rendrait les importations un énorme gâchis.
Alphadelta14
@ Alphadelta14 Ce serait un énorme gâchis même de les trouver tous. Voir la suggestion dans le lien à la fin de ma réponse.
alko
2
Ce lien SO fait que PyLint ignore l'importation de certains modules. Je ne suis pas sûr qu'il supprime les erreurs de non-membre pour ces fichiers. Je voudrais également éviter de patcher mon PyLint si possible.
Alphadelta14
@ Alphadelta14 Je suppose que vous devriez alors attendre un patch pour PyLint.
alko
4

J'ai dû ajouter ceci en haut de tout fichier où j'utilise beaucoup numpy.

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

Juste au cas où quelqu'un dans l'éclipse aurait des problèmes avec Pydev et pylint ...

Jakebrinkmann
la source
4

Dans Extension to j_hougs answer, vous pouvez maintenant ajouter les modules en question à cette ligne dans .pylintrc, qui est déjà préparée vide lors de la génération:

extension-pkg-whitelist=numpy

vous pouvez générer un exemple .pylintrc en faisant:

pylint --generate-rcfile > .pylintrc

puis éditez la ligne mentionnée

transistor
la source
4

Ceci a finalement été résolu dans Pylint 1.8.2. Fonctionne hors de la boîte, aucun ajustement de pylintrc n'est nécessaire!

Tomi Aarnio
la source
3

C'est la pseudo-solution que j'ai trouvée pour ce problème.

#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

Ensuite, dans votre code, au lieu d'appeler les numpyfonctions que np.arrayet np.zeroset ainsi de suite, vous écririez np_array, np_zerosetc. Les avantages de cette approche par rapport aux autres approches proposées dans d' autres réponses:

  • La désactivation / l'activation du pylint est limitée à une petite région de votre code
  • Cela signifie que vous n'avez pas à entourer chaque ligne qui a un appel d'une fonction numpy avec une directive pylint.
  • Vous ne désactivez pas l'erreur pour l'ensemble de votre fichier, ce qui pourrait masquer d'autres problèmes avec votre code.

L'inconvénient évident est que vous devez explicitement importer chaque fonction numpy que vous utilisez. L'approche pourrait être approfondie. Vous pouvez définir votre propre module, appelez-le par exemple, numpy_importercomme suit

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

Ensuite, votre code d'application pourrait importer ce module uniquement (au lieu de numpy) comme

import numpy_importer as np 

et utiliser les noms , comme d' habitude: np.zeros, np.arrayetc.

L'avantage de ceci est que vous aurez un module unique dans lequel toutes numpyles importations associées sont effectuées une fois pour toutes, puis vous l'importez avec cette seule ligne, où vous le souhaitez. Cependant, vous devez faire attention à numpy_importerne pas importer les noms qui n'existent pas numpycar ces erreurs ne seront pas détectées par pylint.

Mateo
la source
2

J'ai eu ce problème avec numpy, scipy, sklearn, nipy, etc., et je l'ai résolu en enveloppant epylint comme ceci:

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

Ce script exécute simplement epylint, puis gratte sa sortie pour filtrer les avertissements et les erreurs faux positifs. Vous pouvez l'étendre en ajoutant plus de cas elif.

NB: Si cela s'applique à vous, vous voudrez modifier votre pychechers.sh pour qu'il aime comme ça

#!/bin/bash

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

(Bien sûr, vous devez d'abord créer un exécutable epylint.py)

Voici un lien vers mon .emacs https://github.com/dohmatob/mydotemacs . J'espère que cela est utile à quelqu'un.

dohmatob
la source
2

Cela semble fonctionner au moins sur Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy
Tomi Aarnio
la source
2

Cette solution a fonctionné pour moi

En gros, allez dans Sélectionnez l'icône d'engrenage en bas à gauche => Paramètres => Paramètres de l'espace de travail => Extension => Configuration Python => Cliquez sur n'importe quel Settings.json => ajoutez-le dans le fichier "python.linting.pylintArgs": [" --extension-pkg-whitelist = numpy "] J'utilise VS 1.27.2

Sanjeev Singh Kenwar
la source
2

J'ai eu le même problème avec un module différent ( kivy.properties) qui est un module C enveloppé comme numpy.

En utilisant VSCode V1.38.0, la solution acceptée a arrêté tout peluchage pour le projet. Donc, même si cela a effectivement éliminé les faux positifs no-name-in-module, cela n'a pas vraiment amélioré la situation.

La meilleure solution de contournement pour moi était d'utiliser l' --ignored-modulesargument sur le module incriminé. Le problème est que la transmission de tout argument via python.linting.pylintArgsefface les paramètres VSCode par défaut , vous devez donc les redéfinir également. Cela m'a laissé avec le fichier settings.json suivant:

{
    "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
la source
"python.linting.pylintArgs": ["--generate-members = kivy.properties"]
yee
1

Un peu de copier-coller de la réponse précédente pour résumer ce qui fonctionne (du moins pour moi: debian-jessie)

  1. Dans certaines versions plus anciennes de, pylintil y avait un problème qui l'empêchait de fonctionner avec numpy (et d'autres packages similaires).

  2. Maintenant, ce problème a été résolu mais les packages C externes (interfaces python vers le code C -comme numpy-) sont désactivés par défaut pour des raisons de sécurité.

  3. Vous pouvez créer une liste blanche, pour permettre pylintde les utiliser dans le fichier ~/.pylintrc.

Commande de base à exécuter: # UNIQUEMENT si vous n'avez pas déjà un fichier .pylintrc dans votre maison $ pylint --generate-rcfile> .pylintrc

Ensuite, ouvrez le fichier et ajoutez les packages que vous souhaitez après extension-pkg-whitelist=séparés par une virgule. Vous pouvez avoir le même comportement en utilisant l'option --extension-pkg-whitelist=numpyde la ligne de commande.

Si vous ignorez certains packages dans la [TYPECHECK]section, cela signifie que pylintcela ne montrera jamais d'erreur liée à ces packages. En pratique, pylintne vous dira rien sur ces packages.

Riccardo Petraglia
la source
0

J'ai travaillé sur un patch pour pylint pour résoudre le problème des membres dynamiques dans des bibliothèques telles que numpy. Il ajoute une option "dynamic-modules" qui oblige à vérifier si des membres existent lors de l'exécution en effectuant une véritable importation du module. Voir le problème n ° 413 dans logilab / pylint . Il y a aussi une pull request, voir le lien dans l'un des commentaires.

Czarek Tomczak
la source
Voici comment pydev le résout (une liste spéciale de modules à inspecter en charge). Comment ça va?
Epu
0

Une réponse rapide: mettez à jour Pylint vers 1.7.1 (utilisez Pylint 1.7.1 fourni par conda-forge si vous utilisez conda pour gérer les paquets)

J'ai trouvé un problème similaire dans pylint GitHub ici et quelqu'un a répondu que tout allait bien après la mise à jour vers la 1.7.1.

Léon
la source
0

Je ne sais pas si c'est une solution, mais dans VSCode, une fois que j'ai écrit explicitement dans mes paramètres utilisateur pour activer pylint, tous les modules ont été reconnus.

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}
Byryepez
la source
0

Dernièrement (depuis que quelque chose a changé dans spyder ou pylint ou?), J'ai reçu des erreurs E1101 ("aucun membre") de l'analyse de code statique de spyder sur les symboles astropy.constants. Je ne sais pas pourquoi.

Ma solution simpliste pour tous les utilisateurs sur un système Linux ou Unix (Mac est probablement similaire) est de créer un / etc / pylintrc comme suit:

[TYPECHECK]
ignored-modules=astropy.constants

Bien sûr, cela pourrait, à la place, être placé dans un fichier personnel $ HOME / .pylintrc. Et, j'aurais pu mettre à jour un fichier existant.

Richard Elkins
la source