Як змусити PyLint розпізнавати нумерованих членів?


163

Я запускаю PyLint в проекті Python. PyLint звертається до багатьох скарг з приводу того, що не в змозі знайти нудотних членів. Як я можу цього уникнути, уникаючи пропускання чеків членства.

З коду:

import numpy as np

print np.zeros([1, 4])

Який, коли побіг, отримую очікуване:

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

Однак пілінт дає мені цю помилку:

E: 3, 6: Модуль 'numpy' не має 'нульового' члена (не член)

Для версій я використовую pylint 1.0.0 (astroid 1.0.1, поширений 0.60.0) і намагаюся працювати з numpy 1.8.0.

Відповіді:


75

Якщо ви використовуєте Visual Studio Code з відмінним розширенням Python від Don Jayamanne , додайте налаштування користувача до білого списку:

{
    // 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-module = numpy", "--ignored-class = 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

2
На Linux з pylint 1.4.4, astroid 1.3.8 та Python 3.4.3 це спрацювало, але мені довелося поставити extension-pkg-whitelist=numpyрядок під [MASTER]заголовком файлу .pylintrc. pylint, здається, є досить крихким програмним забезпеченням і вимагає дотику експерта, щоб він працював над основними завданнями.
Ерік Лещинський

12
Це не гарне рішення. Все, що це робиться - це повністю відключити перевірку пілінгу на наявність будь-яких членів. В ідеалі ви хочете, щоб вони їх правильно розпізнали, що і роблять інші рішення.
iFreilicht

1
@iFreilicht Це міра безпеки. Під час виконання визначення модулів можуть динамічно змінюватися; але включення цього в пілінт передбачає виконання довільного коду. Тим не менш, я все-таки очікую якусь зауваження у відповіді про те --extension-pkg-whitelist, що фактично здійснює імпорт для зазначеного модуля.
Зев Шпіц

43

Я отримував таку ж помилку для невеликого зануреного проекту, над яким я працював, і вирішив, що ігнорування модулів з нумером буде добре. Я створив .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

і це "виправило" мою проблему.


6
Ви впевнені, що вам довелося додати його і до двох ignored-*входів? Для мене просто додавання модуля до білого списку розширень працює ідеально.
iFreilicht

39

В останніх версіях pylint можна додати --extension-pkg-whitelist=numpyдо команди pylint. Вони вирішили цю проблему в попередній версії небезпечним чином. Тепер, якщо ви хочете, щоб вони уважніше переглядали пакунок поза стандартною бібліотекою, ви повинні явно додати його в білий список. Дивіться тут.


2
Посилання "Дивіться тут" мертве. Однак рішення все ще працює, важко зрозуміти, чому. Було б непогано додати уривок із пов’язаного випуску.
Гергелі Полонкай

Посилання "Дивіться тут" було виправлено (зараз посилання на ту саму проблему в 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

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


Я б сказав, що вам не потрібно клонувати новий логілаб / common, але вам потрібно встановити новий logilab / astroid. Перевстановивши logilab / astroid та logilab / pylint, це вирішує помилку для мене.
Paugier

7
Які версії ви використовуєте? Я перебуваю на astroid 1.3.2 та pylint 1.4.0, і я все ще отримую проблему з from numpy import ceilрезультатами цього коду, коли E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) я перевірив посилання, про яке йдеться вище, і, здається, ці зміни є у версії astroid, яку я маю.
Zach Dwiel

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
Мабуть, це все ще не зафіксовано в пілінті 1.4.2, астроїд 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.*

Для згаданого в коді питання на даний момент це видається зайвим, але все ще має значення для інших модулів, тобто. netiface та ін.


У мене була така ж проблема при використанні patsy.dmatrices. Додавання generated-members=patsy.dmatricesвирішило мою проблему.
Jonas Dahlbæk

12

Якщо ви не хочете додати більше конфігурацій, додайте цей код у свій конфігураційний файл замість "білого списку".

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

9
Слід зазначити, що це стосується дуже специфічно кодексу VS.
Берс

Він буде виводити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

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.


Я б хотів, щоб я міг просто імпортувати подібні методи, але я використовую занадто багато функцій, і це зробило б імпорт величезним безладом.
Alphadelta14

@ Alphadelta14 Було б величезним безладом навіть знайти їх усіх. Дивіться пропозицію за посиланням наприкінці моєї відповіді.
алко

2
Це посилання SO змушує PyLint ігнорувати імпорт деяких модулів. Я не дуже впевнений, що це змусить придушити помилки, що не належать до цих файлів. Я також хотів би уникнути виправлення мого PyLint, якщо це можливо.
Alphadelta14

@ Alphadelta14 Я думаю, вам слід дочекатися патчу до PyLint.
алко

4

Мені довелося додати це у верхній частині будь-якого файлу, де я багато використовую numpy.

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

Про всяк випадок, якщо хтось у затемненні має проблеми з Підевом та пілінтетом ...


4

У відповіді Розширення на j_hougs тепер ви можете додати питання, про які йдеться, у цей рядок у .pylintrc, який вже готовий пустим для генерації:

extension-pkg-whitelist=numpy

ви можете створити зразок .pylintrc, виконавши:

pylint --generate-rcfile > .pylintrc

а потім відредагуйте згаданий рядок


4

Це остаточно було вирішено в Pylint 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і т.д. Переваги такого підходу в порівнянні з іншими підходами , запропонованими в інших відповідях:

  • Відключення / ввімкнення пілінту обмежено невеликою областю коду
  • Це означає, що вам не доведеться оточувати кожну окрему рядок, який має виклик функції numpy, за допомогою директиви 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 . Сподіваюся, це комусь корисно.



2

Це рішення спрацювало на мене

В основному перейдіть до Вибір піктограми шестірні зліва внизу => Налаштування => Налаштування робочої області => Розширення => Конфігурація Python => Клацніть на будь-які налаштування.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аргументу на модулі, що порушує. Проблема полягає в тому, що передаючи будь-який аргумент через стерти налаштування VSCodepython.linting.pylintArgs за замовчуванням , тому вам також потрібно встановити їх ще раз. У мене залишився такий файл 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 до кодового типу numpy-) відключені за замовчуванням з міркувань безпеки.

  3. Ви можете створити білий список, щоб дозволити pylintвикористовувати їх у файлі ~/.pylintrc.

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

Потім відкрийте файл і додайте потрібні пакети після extension-pkg-whitelist=розділення комою. Ви можете мати таку саму поведінку, використовуючи параметр--extension-pkg-whitelist=numpy з командного рядка.

Якщо ви проігноруєте деякі пакети в [TYPECHECK]розділі, це означає, що pylintніколи не з’являться помилки, пов'язані з цими пакетами. На практиці pylintнічого про вас не розповість.


0

Я працював над патчем на pylint, щоб вирішити проблему з динамічними членами в бібліотеках, таких як numpy. Він додає опцію "динамічні модулі", яка змушує перевірити наявність членів під час виконання, реально імпортуючи модуль. Див. Випуск № 413 у логілабі / пілінті . Також є запит на витяг, див. Посилання в одному з коментарів.


Ось як вирішує це pydev (спеціальний перелік модулів для завантаження-перевірки). Як йде ця робота?
Епу

0

Швидка відповідь: оновіть Pylint до 1.7.1 (використовуйте надану кондицію Pylint 1.7.1, якщо ви використовуєте conda для управління пакетами)

Тут я знайшов подібну проблему в Pylint GitHub, і хтось відповів на все, що все в порядку після оновлення до 1.7.1.


0

Я не впевнений, чи це рішення, але коли VSCode явно написав у своїх налаштуваннях користувача, щоб активувати pylint, всі модулі були розпізнані.

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

0

Останнім часом (оскільки щось змінилося в шпидері чи пілінті чи?), Я отримував помилки E1101 ("немає учасника") зі статичного аналізу шпидером на символах astropy.constants. Не знаю, чому.

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

[TYPECHECK]
ignored-modules=astropy.constants

Звичайно, це замість цього можна помістити в особистий файл $ HOME / .pylintrc. І я міг би оновити існуючий файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.