Как я могу получить PyLint для распознавания numy членов?

163

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

Из кода:

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, обычно 0.60.0) и пытаюсь работать с numpy 1.8.0.

Alphadelta14
источник

Ответы:

75

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

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}
Дэвид Кларк
источник
2
Это помогло! на VSCode 1.12.2 подтвердил, что работает на Windows 10 x64.
Симара
8
Мне нужно больше: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Питер
2
Решение @Peter, работающее в Windows 7 x64 и Visual Studio Code 1.15.1 !!
BSP
3
@BSP Пост Питера не решает проблему, он игнорирует ее. Если бы я мог понизить этот комментарий, я бы ..
Джонатан Х
4
Это больше не работает для меня с Pylint 2.3.0.
Guillochon
58

У меня была такая же проблема здесь, даже с последними версиями всех связанных пакетов ( 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
paduwan
источник
2
В Linux с Pylint 1.4.4, Astroid 1.3.8 и Python 3.4.3 это работало, но мне пришлось поместить extension-pkg-whitelist=numpyстроку под [MASTER]заголовком файла .pylintrc. Pylint, кажется, довольно хрупкое программное обеспечение и требует прикосновения эксперта, чтобы он работал для основных задач.
Эрик Лещинский
12
Это не хорошее решение. Все, что он делает, это полностью отключает проверку Pylint на наличие каких-либо членов. В идеале вы бы хотели, чтобы он распознал их должным образом, что и делают другие решения.
iFreilicht
1
@iFreilicht Это мера безопасности. Во время выполнения определения модуля могут изменяться динамически; но включение этого в pylint будет включать запуск произвольного кода. Тем не менее, я бы все-таки ожидал какую-то заметку в ответе о том --extension-pkg-whitelist, что фактически выполняет импорт для указанного модуля.
Зев Шпиц
43

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

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

и следуя советам падувана и 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

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

lmount
источник
6
Вы уверены, что вам нужно было добавить его и к двум ignored-*входам? Для меня просто добавление модуля в белый список расширений работает отлично.
iFreilicht
39

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

j_houg
источник
2
Ссылка «Смотри здесь» не работает. Решение все еще работает, просто сложно понять, почему. Было бы неплохо добавить выдержку из связанной проблемы.
GergelyPolonkai
Ссылка "Смотрите здесь" была исправлена ​​(теперь ссылается на ту же проблему в github)
Дэвид Кларк
Похоже, это работает для модулей и пакетов, но не для имен классов.
Ян А. Мейсон,
17

Так как это лучший результат в 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

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

bijancn
источник
Я бы сказал, что вам не нужно клонировать новый logilab / common, но вам нужно установить новый logilab / astroid. Переустановив logilab / astroid и logilab / pylint, он решает проблему для меня.
paugier
7
Какие версии вы, ребята, используете? Я на астроидах 1.3.2 и 1.4.0 pylint и я все еще получаю эту проблему с помощью этого кода from numpy import ceilприводит E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) я проверил фиксации упомянутой выше , и кажется , что эти изменения в версии астроиды у меня есть.
Зак Двиль
2
Сделал точно так, как предложено в Xubuntu 14.04, и это привело к нерабочему пилинту: py2.7.egg / pylint / lint.py ", строка 866, в check_astroid_module astroid.close () AttributeError:« У модуля «У объекта нет атрибута» закрыть '
бли
3
Возможно, это регрессия - похоже, был релиз, предназначенный для решения проблемы. Так или иначе, я открыл новую проблему об этом в bitbucket.org/logilab/pylint/issue/453/…
dstromberg
4
По-видимому, это все еще не исправлено в Pylint 1.4.2, Astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Билл
12

Для игнорирования всех ошибок, генерируемых атрибутами 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 и т. д.

Spatz
источник
У меня была такая же проблема при использовании patsy.dmatrices. Добавление generated-members=patsy.dmatricesрешило мою проблему.
Йонас Дальбек
12

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

{
"python.linting.pylintArgs": ["--generate-members"],
}
lai_bluejay
источник
9
Вы должны упомянуть, что это относится исключительно к VS Code.
Берс
Будет выводитьсяpylint: error: no such option: --generate-members
Spaceship222
8

За последние несколько лет об этом сообщалось много разных ошибок, например https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports.

Я бы предложил отключить линии, где возникают жалобы.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103
flyingsolow
источник
10
Я так много использую numpy, что могу просто отключить проверку отсутствия элементов во всем файле, однако я хочу избежать этого.
Alphadelta14
2
-1 Только потому, что ответ @ bijancn теперь должен заменить этот.
LondonRob
@ LondonRob это не все же. Проблема все еще существует в 1.4.2. Решение paduwan лучше в том, что оно не требует добавления хакерской лжи в ваш код.
naught101
7

Вероятно, это путается с заумным методом импорта методов numpy. А именно, zerosна самом деле numpy.core.multiarray.zeros, импортируется в клочья с заявлением

from .core import *

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

from .numeric import *

и в цифре вы найдете

zeros = multiarray.zeros

Я думаю, я бы запутался на месте PyLint!

Смотрите эту ошибку для PyLint сбоку.

ALKO
источник
Хотелось бы просто импортировать такие отдельные методы, но я использую слишком много функций, и это приведет к огромному беспорядку при импорте.
Alphadelta14
@ Alphadelta14 Было бы очень сложно даже найти их всех. Смотрите предложение в ссылке в конце моего ответа.
Алко
2
Эта SO-ссылка заставляет PyLint игнорировать импорт некоторых модулей. Я не настолько уверен, что это подавит ошибки, не связанные с этими файлами. Я также хотел бы избежать исправления моего PyLint, если это вообще возможно.
Alphadelta14
@ Alphadelta14 Полагаю, вам стоит подождать патча для PyLint.
Алко
4

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

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

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

jakebrinkmann
источник
4

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

extension-pkg-whitelist=numpy

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

pylint --generate-rcfile > .pylintrc

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

транзистор
источник
4

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

Томи Аарнио
источник
3

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

#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_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.

Матео
источник
2

У меня была эта проблема с 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 <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,

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

NB: Если это относится к вам, то вы захотите изменить свой 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 . Надеюсь, это кому-нибудь пригодится.

dohmatob
источник
2

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

[TYPECHECK]

ignored-classes=numpy
Томи Аарнио
источник
2

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

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

Санджив Сингх Кенвар
источник
2

У меня была такая же проблема с другим модулем ( kivy.properties), который является упакованным модулем Си, как 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"
    ]
}
Мика Барнетт
источник
"python.linting.pylintArgs": [ "--generate-члены = kivy.properties"]
йие
1

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

  1. В некоторых старых версиях pylintвозникла проблема, препятствующая работе с numpy (и другими подобными пакетами).

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

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

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

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

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

Риккардо Петраглия
источник
0

Я работал над патчем для pylint, чтобы решить проблему с динамическими членами в библиотеках, таких как numpy. Он добавляет опцию «dynamic-modules», которая заставляет проверять, существуют ли члены во время выполнения, путем реального импорта модуля. Смотрите выпуск № 413 в logilab / pylint . Также есть запрос на включение, смотрите ссылку в одном из комментариев.

Чарек Томчак
источник
Вот как это решает pydev (специальный список модулей для проверки нагрузки). Как продвигается эта работа?
Epu
0

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

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

Леон
источник
0

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

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}
byryepez
источник
0

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

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

[TYPECHECK]
ignored-modules=astropy.constants

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

Ричард Элкинс
источник