¿Cómo puedo hacer que PyLint reconozca a muchos miembros?

Estoy ejecutando PyLint en un proyecto de Python. PyLint hace muchas quejas acerca de no poder encontrar muchos miembros. ¿Cómo puedo evitar esto evitando saltarme los cheques de membresía?

Desde el código:

import numpy as np print np.zeros([1, 4]) 

Que, cuando corrió, me sale lo esperado:

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

Sin embargo, pylint me da este error:

E: 3, 6: El módulo ‘numpy’ no tiene miembro ‘ceros’ (no-miembro)

Para las versiones, estoy usando pylint 1.0.0 (astroid 1.0.1, common 0.60.0) y trato de trabajar con numpy 1.8.0.

Si utiliza el código de Visual Studio con la excelente extensión de Python de Don Jayamanne, agregue una configuración de usuario a la lista blanca de números:

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

Tuve el mismo problema aquí, incluso con las últimas versiones de todos los paquetes relacionados ( astroid 1.3.2 , logilab_common 0.63.2 , pylon 1.4.0 ).

La siguiente solución funcionó a la numpy : agregué numpy a la lista de módulos ignorados modificando mi archivo pylintrc , en la sección [TYPECHECK] :

 [TYPECHECK] ignored-modules = numpy 

Dependiendo del error, es posible que también deba agregar la siguiente línea (aún en la [TYPECHECK] section ):

 ignored-classes = numpy 

En las versiones recientes de pylint puede agregar --extension-pkg-whitelist=numpy a su comando de pylint. Habían solucionado este problema en una versión anterior de forma insegura. Ahora, si desea que examinen más detenidamente un paquete fuera de la biblioteca estándar, debe incluirlo explícitamente en la lista blanca. Mira aquí.

Estaba recibiendo el mismo error para un pequeño proyecto numpy en el que estaba trabajando y decidí que ignorar los módulos numpy estaría bien. .pylintrc un archivo .pylintrc con:

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

y siguiendo los consejos de paduwan y j_houg, modifiqué los siguientes sectores:

 [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 

y

 [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 

y se “solucionó” mi problema.

Dado que este es el resultado principal en google y me dio la impresión de que tiene que ignorar esas advertencias en todos los archivos:

El problema realmente se ha solucionado en las fonts de pylint / astroid el mes pasado https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e pero aún no están en los paquetes de Ubuntu.

Para obtener las fonts, solo

 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 

por lo que el último paso probablemente requiera un sudo y, por supuesto, usted necesita mercurial para clonar.

Para ignorar todos los errores generados por los atributos de numpy.core, ahora podemos usar:

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

Como otra solución, agregue esta opción al archivo ~ / .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.* 

Por ahora, para el código de pregunta mencionado, esto parece redundante, pero sigue siendo importante para otros módulos, es decir. netifaces y etc.

Se han informado muchos errores diferentes sobre esto en los últimos años, es decir, https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Yo sugeriría deshabilitar las líneas donde ocurren las quejas.

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

Probablemente, se confunde con el método abstracto de numpy de los métodos de importación. A saber, los zeros son de hecho numpy.core.multiarray.zeros , importados en numpy con una statement

 from .core import * 

a su vez importado con

 from .numeric import * 

y en numérico encontrarás

 zeros = multiarray.zeros 

¡Supongo que me confundiría en lugar de PyLint!

Ver este error para el lado de vista de PyLint.

En la respuesta de Extensión a j_hougs, ahora puede agregar los módulos en cuestión a esta línea en .pylintrc, que ya está preparado vacío en la generación:

 extension-pkg-whitelist=numpy 

Puedes generar una muestra .pylintrc haciendo:

 pylint --generate-rcfile > .pylintrc 

y luego editar la linea mencionada

Tuve que agregar esto en la parte superior de cualquier archivo en el que uso mucho Npypy.

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

En caso de que alguien en eclipse tenga problemas con Pydev y pylint …

Esta es la pseudo solución que se me ha ocurrido para este 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 

Luego, en su código, en lugar de llamar a numpy funciones numpy como np.array y np_zeros , etc., escribiría np_array , np_zeros , etc. Ventajas de este enfoque frente a otros enfoques sugeridos en otras respuestas:

  • La inhabilitación / habilitación de pylint está restringida a una pequeña región de su código
  • Eso significa que no tiene que rodear cada línea que tiene una invocación de una función numpy con una directiva pylint.
  • No está haciendo el pylint deshabilitado del error para todo su archivo, lo que podría enmascarar otros problemas con su código.

La clara desventaja es que tiene que importar explícitamente cada función numpy que use. El enfoque podría ser elaborado más adelante. Podría definir su propio módulo, numpy_importer decir, numpy_importer siguiente manera

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

Luego, el código de su aplicación podría importar este módulo solo (en lugar de numpy) como

 import numpy_importer as np 

y use los nombres como de costumbre: np.zeros , np.array , etc.

La ventaja de esto es que tendrá un solo módulo en el que todas las importaciones relacionadas con numpy se realizan de una vez por todas, y luego lo importa con esa única línea, donde lo desee. Sin embargo, debe tener cuidado de que numpy_importer no importe nombres que no existan, ya que esos errores no serán detectados por pylint.

Esto parece funcionar al menos en Pylint 1.1.0:

 [TYPECHECK] ignored-classes=numpy 

Esto finalmente se ha resuelto en Pylint 1.8.2. Trabaja fuera de la caja, no se necesitan ajustes de pylintrc!

Tuve este problema con entumecimiento, scipy, sklearn, nipy, etc., y lo resolví envolviendo el epilint como:

$ cat epylint.py

 #!/usr/bin/python """ Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors Author: DOHMATOB Elvis Dopgima   """ 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, 

Este script simplemente ejecuta epylint, luego raspa su salida para filtrar advertencias y errores falsos positivos. Puedes ampliarlo añadiendo más casos de elif.

NB: Si esto se aplica a usted, entonces querrá modificar su pychechers.sh para que así le guste

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

(Por supuesto, primero debes hacer epylint.py ejecutable)

Aquí hay un enlace a mi .emacs https://github.com/dohmatob/mydotemacs . Espero que sea útil para alguien.

Un poco de copia de la respuesta anterior para resumir lo que funciona (al menos para mí: debian-jessie)

  1. En una versión anterior de pylint había un problema que impedía que funcionara con numpy (y otros paquetes similares).

  2. Ahora ese problema se ha resuelto, pero los paquetes externos de C (interfaces de Python con el código C -como numpy-) están deshabilitados de forma predeterminada por razones de seguridad.

  3. Puede crear una lista blanca para permitir que pylint use en el archivo ~/.pylintrc .

Comando básico para ejecutar: # SOLAMENTE si aún no tiene un archivo .pylintrc en su casa $ pylint –generate-rcfile> .pylintrc

Luego abra el archivo y agregue los paquetes que desee después de la extension-pkg-whitelist= separados por comas. Puede tener el mismo comportamiento usando la opción --extension-pkg-whitelist=numpy desde la línea de comando.

Si ignora algunos paquetes en la sección [TYPECHECK] , eso significa que pylint nunca mostrará un error relacionado con esos paquetes. En la práctica, pylint no le dirá nada sobre esos paquetes.

Esta solucion funciono para mi

Básicamente, vaya a Seleccione el ícono de engranaje en la parte inferior izquierda => Configuración => Área de trabajo Configuración => Extensión => Configuración de Python => Haga clic en cualquier Settings.json => agregue esto en el archivo “python.linting.pylintArgs”: [” –extension-pkg-whitelist = numpy “] Estoy usando VS 1.27.2

Si no desea agregar más configuraciones, agregue este código a su archivo de configuración, en lugar de ‘lista blanca’.

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

He estado trabajando en un parche a pylint para resolver el problema con miembros dynamics en bibliotecas como numpy. Agrega una opción de “módulos dynamics” que obliga a verificar si existen miembros durante el tiempo de ejecución al realizar una importación real del módulo. Vea el número 413 en logilab / pylint . También hay una solicitud de extracción, ver enlace en uno de los comentarios.

Una respuesta rápida: actualice Pylint a 1.7.1 (use conda-forge proporcionado Pylint 1.7.1 si usa conda para administrar paquetes)

Encontré un problema similar en Pylint GitHub aquí y alguien respondió que todo estaba bien después de actualizar a 1.7.1.

No estoy seguro si esto es una solución, pero en VSCode, una vez que escribí explícitamente en mi configuración de usuario para habilitar el pylint, todos los módulos fueron reconocidos.

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