xticks font python numpy pylint

python - font - ¿Cómo consigo que PyLint reconozca los miembros numpy?



set title python (18)

Estoy ejecutando PyLint en un proyecto de Python. PyLint presenta muchas quejas sobre no poder encontrar miembros numpy. ¿Cómo puedo evitar esto mientras evito omitir las comprobaciones de membresía?

Del código:

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

Que, cuando se ejecuta, obtengo lo esperado:

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

Sin embargo, pylint me da este error:

E: 3, 6: Módulo ''numpy'' no tiene miembro ''ceros'' (no miembro)

Para las versiones, estoy usando pylint 1.0.0 (astroid 1.0.1, 0.60.0 común) y tratando de trabajar con numpy 1.8.0.


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

  1. En algunas versiones anteriores de pylint había un problema que impedía trabajar con numpy (y otros paquetes similares).

  2. Ahora que el problema se ha resuelto, los paquetes C externos (las interfaces de Python al código C, como numpy) están deshabilitados por defecto por razones de seguridad.

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

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

A continuación, abra el archivo y agregue los paquetes que desee después de la extension-pkg-whitelist= separados por comas. Puede tener el mismo comportamiento utilizando 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.


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

El problema se ha corregido en las fuentes 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 fuentes, 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, necesitas mercurial para clonar.


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 edita la línea mencionada


En las versiones recientes de pylint puede agregar --extension-pkg-whitelist=numpy a su comando pylint. Habían solucionado este problema en una versión anterior de una manera 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í.


Esta es la pseudo-solución que se me ocurrió 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 y así sucesivamente, escribiría np_array , np_zeros , etc. Ventajas de este enfoque frente a otros enfoques sugeridos en otras respuestas:

  • La función de inhabilitar / habilitar pylint está restringida a una pequeña región de tu 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 la inhabilitación de pylint del error para todo su archivo, lo que podría enmascarar otros problemas con su código.

La clara desventaja es que tienes que importar explícitamente cada función numpy que usas. El enfoque podría profundizarse más. Podrías definir tu propio módulo, llámalo say, 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

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

import numpy_importer as np

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

La ventaja de esto es que tendrá un único módulo en el que todas las importaciones relacionadas con numpy se realizarán de una vez y para siempre, y luego lo importará con esa única línea, donde quiera. De todos modos, debes tener cuidado de que numpy_importer no importe nombres que no existan en numpy ya que los errores no serán captados por pylint.


Estaba obteniendo el mismo error para un pequeño proyecto numpy en el que estaba trabajando y decidí que ignorar los módulos numpy me irí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 "solucionó" mi problema.


Esto finalmente se resolvió en Pylint 1.8.2. ¡Funciona de la caja, no se necesitan ajustes Pylintrc!


Esto parece funcionar al menos en Pylint 1.1.0:

[TYPECHECK] ignored-classes=numpy


He estado trabajando en un parche para formar una pila para resolver el problema con miembros dinámicos en bibliotecas como Numpy. Agrega una opción de "módulos dinámicos" que obliga a comprobar si los miembros existen durante el tiempo de ejecución realizando una importación real del módulo. Vea el Issue # 413 en logilab / pylint . También hay una solicitud de extracción, vea el enlace en uno de los comentarios.


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

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


Por 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 a ~ / .pylintrc o archivo / 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.*

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


Probablemente, se confunda con el método abstruso de importación de métodos de Numpy. A saber, zeros es de hecho numpy.core.multiarray.zeros , importado en numpy con declaración

from .core import *

a su vez importado con

from .numeric import *

y en numérico encontrarás

zeros = multiarray.zeros

¡Creo que estaría confundido en lugar de PyLint!

Vea https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports para el lado de vista de PyLint.



Si usa Visual Studio Code con la excelente extensión de Python de Don Jayamanne, agregue una configuración de usuario para incluir en la lista blanca numpy:

{ // 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 las numpy : añadí numpy a la lista de módulos ignorados al modificar mi archivo pylintrc , en la sección [TYPECHECK] :

[TYPECHECK] ignored-modules = numpy

Dependiendo del error, también podría necesitar agregar la siguiente línea (aún en la [TYPECHECK] section ):

ignored-classes = numpy


Tuve este problema con numpy, scipy, sklearn, nipy, etc., y lo resolví envolviendo epylint así:

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

Este script simplemente ejecuta epylint, luego raspa su salida para filtrar advertencias y errores falsos positivos. Puede ampliarlo agregando más casos elif.

NB: si esto se aplica a usted, entonces querrá modificar sus pychechers.sh para que así lo desee.

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

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

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


Tuve que agregar esto en la parte superior de cualquier archivo donde uso Numpy mucho.

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

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


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

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