web-dev-qa-db-fra.com

Comment faire en sorte que PyLint reconnaisse les membres numpy?

J'utilise PyLint sur un projet Python. PyLint se plaint beaucoup de ne pas pouvoir trouver de membres numpy. Comment puis-je éviter cela tout en évitant de passer les contrôles d'adhésion?.

À partir du code:

import numpy as np

print np.zeros([1, 4])

Qui, quand couru, j'obtiens le prévu:

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

Cependant, pylint me donne cette erreur:

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

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

150
Alphadelta14

Si vous utilisez le code Visual Studio 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"
    ]
}
70
David Clarke

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

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

[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
54
paduwan

J'avais la même erreur pour un petit projet Numpy sur lequel je travaillais et j'ai décidé qu'ignorer les modules Numpy ferait l'affaire. J'ai créé un fichier .pylintrc avec:

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

et suivant les conseils de paduwan et de 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 cela a "corrigé" mon problème.

39
lmount

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 en liste blanche. Voir ici.

39
j_houg

Comme il s’agit du meilleur résultat dans Google et que cela me donne l’impression que vous devez ignorer ces avertissements dans tous les fichiers:

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

Pour obtenir les sources, il suffit de

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

la dernière étape nécessitera très probablement une Sudo et bien sûr, vous aurez besoin de Mercurial pour le cloner.

17
bijancn

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

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

Une autre solution consiste à ajouter cette option à ~/.pylintrc ou / etc/pylintrc fichier:

[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 de question mentionné à ce stade, cela semble redondant, mais reste important pour un autre module, à savoir. netifaces et etc.

9
Spatz

Plusieurs bogues différents ont été signalés à ce sujet au cours des dernières années, par exemple 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
7
flyingsolow

Probablement, cela est confondu avec la méthode abstruse d’importation de méthodes de numpy. À savoir, zeros est en fait numpy.core.multiarray.zeros, importé 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 de PyLint.

6
alko

Dans Extension to j_hougs answer, vous pouvez maintenant ajouter les modules en question à cette ligne dans .pylintrc, qui est déjà préparé 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

4
transistor

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

4
Tomi Aarnio

Si vous ne voulez pas ajouter plus de config, veuillez ajouter ce code à votre fichier de config, à la place de 'liste blanche'.

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

Je devais ajouter ceci en haut de tout fichier dans lequel j'utilise beaucoup numpy.

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

Juste au cas où quelqu'un chez Eclipse aurait des problèmes avec Pydev et pylint ...

3
jakebrinkmann

C’est la pseudo-solution que j’ai trouvée pour résoudre 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 numpy comme np.array et np.zeros et ainsi de suite, vous écririez np_array, np_zeros, etc. Avantages de cette approche par rapport aux autres approches suggérées dans d'autres réponses:

  • Le pylint disable/enable est limité à une petite région de votre code
  • Cela signifie que vous n'avez pas à entourer chaque ligne qui a l'invocation d'une fonction numpy avec une directive pylint.
  • Vous ne désactivez pas l'erreur pylint pour l'ensemble de votre fichier, ce qui pourrait masquer d'autres problèmes liés à votre code.

Le désavantage évident est que vous devez importer explicitement chaque fonction numpy que vous utilisez. L'approche pourrait être développée plus avant. Vous pouvez définir votre propre module, appelez-le en disant: numpy_importer comme 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) en tant que

import numpy_importer as np 

et utilisez les noms comme d'habitude: np.zeros, np.array etc.

L'avantage de cela est que vous aurez un seul module dans lequel toutes les importations liées à numpy sont effectuées une fois pour toutes, puis vous l'importez avec cette seule ligne, où vous le souhaitez. Vous devez néanmoins faire attention à ce que numpy_importer n’importe pas de noms qui n’existent pas dans numpy car ces erreurs ne seront pas interceptées par pylint.

3
Mateo

Cela semble fonctionner au moins sur Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy
3
Tomi Aarnio

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

$ 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 __== "__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 efface sa sortie pour filtrer les avertissements et les erreurs faussement positifs. Vous pouvez l'étendre en ajoutant plus de cas Elif.

NB: Si cela vous concerne, alors vous voudrez modifier votre pychechers.sh pour qu'il aime ça

#!/bin/bash

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

(Bien sûr, vous devez commencer par exécuter epylint.py)

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

2
dohmatob

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 pylint, un problème 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 avec le code C - like numpy-) sont désactivés par défaut pour des raisons de sécurité.

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

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

Puis ouvrez le fichier et ajoutez les paquetages que vous voulez 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=numpy à partir de la ligne de commande.

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

1
Riccardo Petraglia

Cette solution a fonctionné pour moi

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

1

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

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 version 1.7.1.

0
Leon

Dernièrement (depuis que quelque chose a changé dans spyder ou pylint ou?), Je reçois des erreurs E1101 ("aucun membre") à partir de l'analyse de code statique de spyder sur les symboles astropy.constants. Aucune idée pourquoi.

Ma solution simpliste pour tous les utilisateurs d’un système Linux ou Unix (le système Mac est probablement similaire) consiste à créer un fichier/etc/pylintrc comme suit:

[TYPECHECK]
ignored-modules=astropy.constants

Bien entendu, ceci pourrait plutôt être placé dans un fichier personnel $ HOME/.pylintrc. Et, j'aurais pu mettre à jour un fichier existant.

0
Richard Elkins

Je ne suis pas sûr qu'il s'agisse d'une solution, mais dans VSCode, une fois que j'ai explicitement écrit dans mes paramètres utilisateur pour activer pylint, tous les modules ont été reconnus.

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

J'ai travaillé sur un correctif pour pylint afin de résoudre le problème avec 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 Numéro 413 dans Logilab/pylint . Il y a aussi une demande de tirage, voir lien dans l'un des commentaires.

0
Czarek Tomczak