¿Cómo hago para que PyLint reconozca miembros numpy?


163

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

Del código:

import numpy as np

print np.zeros([1, 4])

Lo cual, cuando corro, obtengo 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, común 0.60.0) e intento trabajar con numpy 1.8.0.

Respuestas:


75

Si usa Visual Studio Code con la excelente extensión 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"
    ]
}

2
Esto ayudó! en VSCode 1.12.2 confirmó que funciona en Windows 10 x64.
Simara

8
Necesitaba más: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter

2
¡La solución de @Peter funciona en Windows 7 x64 y Visual Studio Code 1.15.1!
BSP

3
La publicación de @BSP Peter no resuelve el problema, lo ignora. Si pudiera rechazar este comentario, lo haría ..
Jonathan H

44
Esto ya no me funciona con pylint 2.3.0.
Guillochon

58

Yo tenía 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 mil maravillas: agregué numpya la lista de módulos ignorados modificando mi pylintrcarchivo, en la [TYPECHECK]sección:

[TYPECHECK]

ignored-modules = numpy

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

ignored-classes = numpy

2
En Linux con Pylint 1.4.4, Astroid 1.3.8 y Python 3.4.3, esto funcionó, pero tuve que poner la extension-pkg-whitelist=numpylínea debajo del [MASTER]encabezado del archivo .pylintrc. pylint parece ser un software bastante frágil y requiere el toque de un experto para que funcione en tareas básicas.
Eric Leschinski

12
Esta no es una buena solución. Todo lo que hace es deshabilitar completamente la comprobación de pylint para la existencia de cualquier miembro. Lo ideal sería que los reconociera correctamente, que es lo que hacen las otras soluciones.
iFreilicht

1
@iFreilicht Es una medida de seguridad. En tiempo de ejecución, las definiciones de módulo pueden cambiar dinámicamente; pero habilitar esto en pylint implicaría ejecutar código arbitrario. Sin embargo, todavía esperaría algún tipo de nota en la respuesta sobre --extension-pkg-whitelist, que realmente lleva a cabo la importación para el módulo especificado.
Zev Spitz

43

Recibía el mismo error para un pequeño proyecto numpy en el que estaba trabajando y decidí que ignorar los módulos numpy funcionaría bien. Creé un .pylintrcarchivo 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.


66
¿Estás seguro de que también tenías que agregarlo a las dos ignored-*entradas? Para mí, simplemente agregar un módulo a la lista blanca de extensiones funciona perfectamente.
iFreilicht

39

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


2
El enlace "Ver aquí" está muerto. Sin embargo, la solución sigue funcionando, es difícil de entender, por qué. Sería bueno agregar un extracto del problema vinculado.
GergelyPolonkai

El enlace "Ver aquí" se ha solucionado (ahora hace referencia al mismo problema en github)
David Clarke

Parece que funciona para módulos y paquetes, pero no para nombres de clase.
Ian A. Mason

17

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

El problema se solucionó 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 requerirá un sudoy, por supuesto, necesita mercurial para clonar.


Diría que no necesita clonar el nuevo logilab / common, pero sí necesita instalar el nuevo logilab / astroid. Al reinstalar logilab / astroid y logilab / pylint, soluciona el error por mí.
paugier

77
¿Qué versiones están usando? Estoy en astroid 1.3.2 y pylint 1.4.0 y sigo teniendo el problema con los from numpy import ceilresultados de este código E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) , compruebo la confirmación mencionada anteriormente y parece que esos cambios están en la versión de astroid que tengo.
Zach Dwiel

2
Hizo exactamente lo sugerido en Xubuntu 14.04 y esto resultó en un pylint que no funciona: py2.7.egg / pylint / lint.py ", línea 866, en check_astroid_module astroid.close () AttributeError: el objeto 'Módulo' no tiene atributo ' cerrar '
bli

3
Quizás esto sea una regresión: parece haber habido una versión destinada a solucionar el problema. De cualquier manera, he abierto un nuevo número al respecto en bitbucket.org/logilab/pylint/issue/453/…
dstromberg

44
Aparentemente, esto aún no se solucionó en pylint 1.4.2, astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Bill

12

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 lo mencionado en el código de la pregunta por ahora esto parece redundante, pero todavía es importante para otros módulos, es decir. Netifaces y etc.


Tuve el mismo problema al usar patsy.dmatrices. Agregar generated-members=patsy.dmatricesresolvió mi problema.
Jonas Dahlbæk

12

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"],
}

9
Debe mencionar que esto se aplica muy específicamente al Código VS.
bers

Saldrápylint: error: no such option: --generate-members
Nave espacial222

8

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

Sugeriría deshabilitar las líneas donde ocurren las quejas.

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

10
Uso tanto numpy, que también podría deshabilitar la verificación de no miembro en todo el archivo, sin embargo, quiero evitar hacerlo.
Alphadelta14

2
-1 Solo porque la respuesta de @ bijancn ahora debería reemplazar a esta.
LondonRob

@LondonRob no lo hace sin embargo. El problema todavía existe en 1.4.2. La solución de paduwan es mejor porque no requiere agregar hacky cruft a su código.
naught101

7

Probablemente, se confunde con el método abstruso de importación de métodos de numpy. Es decir, zerosde hecho numpy.core.multiarray.zeros, se importa 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

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

Vea este error para el lado de vista de PyLint.


Desearía poder importar métodos individuales como ese, pero uso demasiadas funciones y eso haría que las importaciones sean un gran desastre.
Alphadelta14

@ Alphadelta14 Sería un desastre incluso encontrarlos a todos. Ver sugerencia en el enlace al final de mi respuesta.
alko

2
Ese enlace SO hace que PyLint ignore la importación de algunos módulos. No estoy tan seguro de que haga que suprima los errores de ningún miembro para esos archivos. También me gustaría evitar parchar mi PyLint si es posible.
Alphadelta14

@ Alphadelta14 Supongo que deberías esperar un parche para PyLint entonces.
alko

4

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

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

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


4

En la extensión a la respuesta 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

puede generar una muestra .pylintrc haciendo:

pylint --generate-rcfile > .pylintrc

y luego edite la línea mencionada


4

Esto finalmente se resolvió en Pylint 1.8.2. Funciona de fábrica, ¡no se necesitan ajustes de pylintrc!


3

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 numpyfunciones comonp.array y np.zerosy así sucesivamente, que iba a escribir np_array, np_zerosetc. Las ventajas de este método frente a otros enfoques sugeridos en otras respuestas:

  • El deshabilitar / habilitar pylint está restringido 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á deshabilitando pylint del error para todo su archivo, lo que podría enmascarar otros problemas con su código.

La clara desventaja es que debe importar explícitamente cada función numpy que use. El enfoque podría desarrollarse más. Puedes definir tu propio módulo, llámalo decir, de la numpy_importersiguiente 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, su código de aplicación podría importar este módulo solamente (en lugar de numpy) como

import numpy_importer as np 

y usa los nombres como siempre: np.zeros , np.arrayetc.

La ventaja de esto es que tendrá un único módulo en el que todas numpylas importaciones relacionadas 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 numpy_importerno importar nombres que no existen, numpyya que esos errores no serán detectados por pylint.


2

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

$ cat epylint.py

#!/usr/bin/python

"""
Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors
Author: DOHMATOB Elvis Dopgima <gmdopp@gmail.com> <elvis.dohmatob@inria.fr>

"""

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 extenderlo agregando más casos elif.

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

#!/bin/bash

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

(Por supuesto, primero debe hacer que epylint.py sea ejecutable)

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


2

Esto parece funcionar al menos en Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy

2

Esta solución me funcionó

Básicamente, vaya a Seleccionar el icono de engranaje de la parte inferior izquierda => Configuración => Configuración del espacio de trabajo => Extensión => Configuración de Python => Haga clic en cualquier Configuración.json => agregue esto en el archivo "python.linting.pylintArgs": [" --extension-pkg-whitelist = numpy "] Estoy usando VS 1.27.2


2

Tuve el mismo problema con un módulo diferente ( kivy.properties) que es un módulo C envuelto como numpy.

Usando VSCode V1.38.0, la solución aceptada detuvo todo el proceso para el proyecto. Entonces, si bien eliminó el falso positivo no-name-in-module, en realidad no mejoró la situación.

La mejor solución para mí fue usar el --ignored-modulesargumento en el módulo ofensivo. El problema es que pasar cualquier argumento a través de python.linting.pylintArgsborra la configuración predeterminada de VSCode , por lo que también debe restablecerlos. Eso me dejó con el siguiente archivo settings.json:

{
    "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"
    ]
}

"python.linting.pylintArgs": [ "--generate-MEMBERS = kivy.properties"]
yee

1

Un poco de copiar y pegar de la respuesta anterior para resumir lo que está funcionando (al menos para mí: debian-jessie)

  1. En alguna versión anterior pylinthabía un problema que impedía que funcionara con numpy (y otros paquetes similares).

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

  3. Puede crear una lista blanca para permitir pylintsu uso 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

Luego abra el archivo y agregue los paquetes que desee después de extension-pkg-whitelist=separarlos con una coma. Puede tener el mismo comportamiento utilizando la opción --extension-pkg-whitelist=numpyde la línea de comando.

Si ignora algunos paquetes en la [TYPECHECK]sección, eso significa que pylintnunca mostrará errores relacionados con esos paquetes. En la práctica, pylintno le diré nada sobre esos paquetes.


0

He estado trabajando en un parche para pylint para resolver el problema con miembros dinámicos en bibliotecas como numpy. Agrega una opción de "módulos dinámicos" que obliga a verificar si existen miembros durante el tiempo de ejecución haciendo una importación real del módulo. Consulte el número 413 en logilab / pylint . También hay una solicitud de extracción, vea el enlace en uno de los comentarios.


Así es como pydev lo resuelve (una lista especial de módulos para cargar-inspeccionar). ¿Cómo va ese trabajo?
Epu

0

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.


0

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, todos los módulos fueron reconocidos.

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

0

Últimamente (desde que algo cambió en spyder o pylint o?), He estado recibiendo errores E1101 ("sin miembro") del análisis de código estático de spyder en símbolos de astropía. No tengo idea de por qué.

Mi solución simplista para todos los usuarios en un sistema Linux o Unix (Mac es probablemente similar) es crear un / etc / pylintrc de la siguiente manera:

[TYPECHECK]
ignored-modules=astropy.constants

Por supuesto, esto podría, en cambio, colocarse en un archivo personal $ HOME / .pylintrc. Y, podría haber actualizado un archivo existente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.