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.
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"
]
}
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
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.
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.
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.
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.
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
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.
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
Ceci a finalement été résolu dans Pylint 1.8.2. Fonctionne hors de la boîte, aucun ajustement de pylintrc nécessaire!
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"],
}
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 ...
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 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.
Cela semble fonctionner au moins sur Pylint 1.1.0:
[TYPECHECK]
ignored-classes=numpy
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.
Un peu de copier coller de la réponse précédente pour résumer ce qui fonctionne (du moins pour moi: debian-jessie)
Dans certaines versions plus anciennes de pylint
, un problème l'empêchait de fonctionner avec numpy (et d'autres packages similaires).
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é.
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.
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
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.
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.
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
}
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.