¿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.

Alphadelta14
fuente

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"
    ]
}
David Clarke
fuente
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
paduwan
fuente
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.

lmount
fuente
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í.

j_houg
fuente
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.

bijancn
fuente
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.

Spatz
fuente
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"],
}
lai_bluejay
fuente
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
flyingsolow
fuente
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.

alko
fuente
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 ...

jakebrinkmann
fuente
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

transistor
fuente
4

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

Tomi Aarnio
fuente
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.

Mateo
fuente
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 <[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 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.

dohmatob
fuente
2

Esto parece funcionar al menos en Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy
Tomi Aarnio
fuente
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

Sanjeev Singh Kenwar
fuente
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"
    ]
}
Mikah Barnett
fuente
"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.

Riccardo Petraglia
fuente
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.

Czarek Tomczak
fuente
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.

León
fuente
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
}
byryepez
fuente
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.

Richard Elkins
fuente