Как заставить 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.

  • Преобразование заголовка строки в столбец для Pandas DataFrame,
  • numpy.array boolean to binary?
  • Исключение, вызванное многопроцессорностью Пул не обнаружен
  • Как я могу профилировать приложение Kivy?
  • Никаких веб-процессов, запускающих Django в heroku
  • Запуск SVM быстрее в python
  • точки сортировки для формирования непрерывной линии
  • Построение графика с помощью Python
  • 15 Solutions collect form web for “Как заставить PyLint распознавать члены numpy?”

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

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

     [TYPECHECK] ignored-modules = numpy 

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

     ignored-classes = numpy 

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

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

     { // whitelist numpy to remove lint errors "python.linting.pylintArgs": [ "--extension-pkg-whitelist=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 

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

    Поскольку это главный результат в 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 и, конечно же, вам понадобится керлон для клонирования.

    Об этом было много разных ошибок за последние несколько лет, то есть 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 

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

     from .core import * 

    в свою очередь,

     from .numeric import * 

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

     zeros = multiarray.zeros 

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

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

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

     #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 будут выполняться раз и навсегда, а затем вы импортируете его с этой единственной строкой, где хотите. Тем не менее вы должны быть осторожны, чтобы numpy_importer не импортировал имена, которые не существуют в numpy поскольку эти ошибки не будут обнаружены pylint.

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

     [TYPECHECK] ignored-classes=numpy 

    У меня была эта проблема с 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 . Надеюсь, это кому-то полезно.

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

     extension-pkg-whitelist=numpy 

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

     pylint --generate-rcfile > .pylintrc 

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

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

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

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

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

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

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

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

    Python - лучший язык программирования в мире.