Как заставить PyLint распознавать члены numpy?

Я запускаю PyLint в проекте Python. PyLint много жалуется на то, что не может найти членов numpy. Как я могу избежать этого, избегая пропуска проверки членства.

Из кода:

import numpy as np

print np.zeros([1, 4])

Что, когда бежал, я получаю ожидаемое:

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

Однако pylint дает мне эту ошибку:

E: 3, 6: "numpy" модуля не имеет элемента "нули" (без члена)

Для версий я использую pylint 1.0.0 (astroid 1.0.1, common 0.60.0) и пытаюсь работать с numpy 1.8.0.

Ответ 1

Если вы используете код Visual Studio с прекрасным расширением Python, добавьте пользовательский параметр в белый список

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

Ответ 2

У меня была такая же проблема, даже с последними версиями всех связанных пакетов (astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

Следующее решение работало как шарм: я добавил numpy в список игнорируемых модулей, изменив мой файл pylintrc в разделе [TYPECHECK]:

[TYPECHECK]

ignored-modules = numpy

В зависимости от ошибки вам также может потребоваться добавить следующую строку (все еще в [TYPECHECK] section):

ignored-classes = numpy

Ответ 3

В последних версиях pylint вы можете добавить --extension-pkg-whitelist=numpy в свою команду pylint. Они исправили эту проблему в более ранней версии небезопасным способом. Теперь, если вы хотите, чтобы они более внимательно смотрели на пакет за пределами стандартной библиотеки, вы должны явно его белым списком. Смотрите здесь.

Ответ 4

Я получал ту же ошибку для небольшого проекта numpy, над которым я работал, и решил, что игнорирование модулей numpy будет очень хорошо. Я создал файл .pylintrc с:

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

и после рекомендаций paduwan и j_houg я изменил следующие сектора:

[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

и

[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

и он "исправил" мою проблему.

Ответ 5

Так как это главный результат в google, и это создавало у меня впечатление, что вы должны игнорировать эти предупреждения во всех файлах:

Проблема действительно была исправлена ​​в источниках pylint/astroid в прошлом месяце https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e но еще не находятся в пакетах Ubuntu.

Чтобы получить источники, просто

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

в результате чего последний шаг, скорее всего, потребует sudo, и, конечно, вам нужно будет использовать mercurial для клонирования.

Ответ 6

Для игнорирования всех ошибок, генерируемых атрибутами numpy.core, теперь мы можем использовать:

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

В качестве другого решения добавьте эту опцию в файл ~/.pylintrc или /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.*

Для упомянутого в вопросительном коде к настоящему времени это кажется лишним, но все еще имеет значение для других модулей, т.е. netifaces и т.д.

Ответ 8

Вероятно, это путается с numpy абсурдным методом импорта методов. А именно, zeros на самом деле numpy.core.multiarray.zeros, импортированный в numpy с утверждением

from .core import *

в свою очередь импортируется с помощью

from .numeric import *

и в числовом выражении вы найдете

zeros = multiarray.zeros

Наверное, я бы смутился вместо PyLint!

См. эту ошибку для стороны обзора PyLint.

Ответ 9

В ответе Extension to j_hougs теперь вы можете добавить соответствующие модули к этой строке в .pylintrc, который уже готов для генерации:

extension-pkg-whitelist=numpy

вы можете сгенерировать образец .pylintrc, выполнив:

pylint --generate-rcfile > .pylintrc

а затем отредактируйте указанную строку

Ответ 10

Это, наконец, решено в Пилинте 1.8.2. Работает из коробки, никаких настроек pylintrc не требуется!

Ответ 11

Если вы не хотите добавлять больше настроек, добавьте этот код в ваш файл конфигурации, а не в "белый список".

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

Ответ 12

Мне пришлось добавить это в начало любого файла, где я много использую numpy.

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

На всякий случай у кого-то в затмении возникают проблемы с Pydev и pylint...

Ответ 13

Это псевдо-решение, которое я придумал для этой проблемы.

#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

Затем в вашем коде вместо вызова numpy функций как np.array и np.zeros и так далее, вы должны написать np_array, np_zeros и т.д. Преимущества этого подхода по сравнению с другими подходами, предложенными в других ответах:

  • Отключение/включение pylint ограничено небольшой областью вашего кода.
  • Это означает, что вам не нужно окружать каждую строку, которая имеет вызов функции numpy с директивой pylint.
  • Вы не делаете pylint отключением ошибки для всего вашего файла, что может замаскировать другие проблемы с вашим кодом.

Очевидным недостатком является то, что вы должны явно импортировать каждую функцию numpy, которую вы используете. Этот подход можно было бы продолжить. Вы можете определить свой собственный модуль, назовите его, numpy_importer следующим образом

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

Затем ваш код приложения может импортировать только этот модуль (вместо numpy) как

import numpy_importer as np 

и используйте имена как обычно: np.zeros, np.array и т.д.

Преимущество этого заключается в том, что у вас будет единственный модуль, в котором все связанные с ним отношения numpy выполняются раз и навсегда, а затем вы импортируете его с этой единственной строкой, где хотите. Тем не менее вы должны быть осторожны, чтобы numpy_importer не импортировал имена, которые не существуют в numpy, поскольку эти ошибки не будут обнаружены pylint.

Ответ 14

Кажется, что это работает, по крайней мере, в Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy

Ответ 15

У меня была эта проблема с numpy, scipy, sklearn, nipy и т.д., и я решил ее, обернув эпилинт так:

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

Этот script просто запускает epylint, затем сбрасывает свой вывод, чтобы отфильтровать ложноположительные предупреждения и ошибки. Вы можете расширить его, добавив больше случаев elif.

N.B.: Если это относится к вам, тогда вы захотите изменить свой pychechers.sh, чтобы ему понравилось это

#!/bin/bash

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

(Конечно, вы должны сначала выполнить epylint.py)

Вот ссылка на мой .emacs https://github.com/dohmatob/mydotemacs. Надеюсь, это кому-то полезно.

Ответ 16

Немного скопируйте пасту из предыдущего ответа, чтобы суммировать то, что работает (по крайней мере для меня: debian-jessie)

  • В старой версии pylint возникла проблема с тем, что она не работает с numpy (и другими подобными пакетами).

  • Теперь эта проблема была решена, но внешние C-пакеты (интерфейсы python для C-кода-numpy-) по умолчанию отключены по соображениям безопасности.

  • Вы можете создать белый список, чтобы позволить pylint использовать их в файле ~/.pylintrc.

Основная команда для запуска:   # ТОЛЬКО, если у вас еще нет файла .pylintrc в вашем доме   $ pylint --generate-rcfile > .pylintrc

Затем откройте файл и добавьте нужные пакеты после extension-pkg-whitelist=, разделенные запятой. Вы можете иметь такое же поведение, используя опцию --extension-pkg-whitelist=numpy из командной строки.

Если вы игнорируете некоторые пакеты в разделе [TYPECHECK], это означает, что pylint никогда не будет показывать ошибку, связанную с этими пакетами. На практике pylint не расскажет вам ничего об этих пакетах.

Ответ 17

Это решение сработало для меня

В общем, перейдите к значку выбора шестеренки слева внизу => Настройка => Настройка рабочего пространства => Расширение => Конфигурация Python => Нажмите на любой файл Settings.json => добавьте его в файл "python.linting.pylintArgs": [" --extension-pkg-whitelist = numpy "] Я использую VS 1.27.2

Ответ 18

У меня была такая же проблема с другим модулем (kivy.properties), который представляет собой обернутый модуль C, например numpy.

Используя VSCode V1.38.0, принятое решение остановило все задержки для проекта. Таким образом, хотя он действительно удалял ложноположительный результат no-name-in-module, он не улучшил ситуацию.

Лучшим обходным путем для меня было использование аргумента --ignored-modules в модуле-нарушителе. Проблема в том, что передача любого аргумента через python.linting.pylintArgs стирает настройки VSCode по умолчанию, поэтому вам также необходимо их переустановить. Это оставило меня со следующим файлом 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"
    ]
}

Ответ 19

Я работал над патчем к pylint, чтобы решить проблему с динамическими членами в таких библиотеках, как numpy. Он добавляет параметр "динамические модули", который заставляет проверять, существуют ли члены во время выполнения, путем реального импорта модуля. См. Проблема № 413 в logilab/pylint. Существует также запрос на растяжение, см. Ссылку в одном из комментариев.

Ответ 20

Быстрый ответ: обновите Pylint до 1.7.1 (используйте conda-forge, предоставленный Pylint 1.7.1, если вы используете conda для управления пакетами)

Я нашел аналогичную проблему в pylint GitHub здесь, и кто-то ответил, что все становится ОК после обновления до 1.7.1.

Ответ 21

Я не уверен, если это решение, но в VSCode, когда я явно написал в своих пользовательских настройках, чтобы включить Pylint, все модули были распознаны.

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

Ответ 22

В последнее время (поскольку что-то изменилось в spyder, pylint или?), Я получаю ошибки E1101 ("нет члена") от статического анализа кода spyder на символах astropy.constants. Понятия не имею почему.

Мое упрощенное решение для всех пользователей в системах Linux или Unix (возможно, Mac аналогичен) состоит в создании /etc/pylintrc следующим образом:

[TYPECHECK]
ignored-modules=astropy.constants

Конечно, вместо этого его можно поместить в личный файл $ HOME/.pylintrc. И я мог бы обновить существующий файл.