Сбой импорта в VScode для pylint при импорте pygame

При импорте pygame pylint сходит с ума:

E1101:Module 'pygame' has no 'init' member
E1101:Module 'pygame' has no 'QUIT' member

Я поискал в сети и нашел это:

"python.linting.pylintArgs": ["--ignored-modules=pygame"]

Это решает проблему с pygame, но теперь pylint сходит с ума по-другому: crazy_pylint.png . Затем я нашел "python.linting.pylintArgs": ["--ignored-files=pygame"], но он полностью отключает pylint для всего каталога, в котором я работаю. Итак, как мне сказать pylint, что с pygame все в порядке?


person Umbrelluck    schedule 26.10.2018    source источник


Ответы (3)


Для E1101: проблема в том, что большая часть Pygame реализована на C напрямую. С точки зрения производительности это все хорошо, но pylint (линтер, используемый VSCode) не может сканировать эти файлы C. К сожалению, эти же файлы определяют множество полезных вещей, а именно QUIT и другие константы, такие как MOUSEBUTTONDOWN, K_SPACE и т. Д., А также такие функции, как init или quit.

Чтобы исправить это, первым делом перестаньте игнорировать модуль pygame, удалив все свои аргументы в "python.linting.pylintArgs". Поверьте, линтер может пригодиться.

Теперь исправим проблемы. Для ваших констант (все, что написано заглавными буквами) вручную импортируйте их следующим образом:

from pygame.constants import (
    MOUSEBUTTONDOWN, QUIT, MOUSEMOTION, KEYDOWN
)

Теперь вы можете использовать их без добавления pygame.:

for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
    if event.type == KEYDOWN: 
        # Code

Затем, для ваших ошибок init и других функций, вы можете вручную помочь линтеру в их устранении двумя способами:

  • Либо добавьте это где-нибудь в свой код: # pylint: disable=no-member. Это отключит проверку членов для всего файла, предотвращая отображение таких ошибок.
  • Или вы можете заключить строку с ошибкой:

    # pylint: disable=no-member
    pygame.quit()
    # pylint: enable=no-member

Это похоже на то, что делает первый метод, но ограничивает эффект только этой строкой.

Наконец, для всех остальных предупреждений решение состоит в том, чтобы исправить их. Pylint предназначен для того, чтобы показать вам места, в которых ваш код либо бессмыслен, либо не соответствует спецификациям Python. Быстрый взгляд на ваш снимок экрана показывает, например, что ваш модуль не имеет строки документации, что вы объявили неиспользуемые переменные ... Pylint поможет вам в написании краткого, ясного и красивого кода. Вы можете игнорировать эти предупреждения или скрыть их (с помощью # pylint: disable= и этих кодов) или потратить немного времени на очистку всего.

В конечном итоге это лучшее решение, так как оно сделает ваш код более читабельным и, следовательно, удобным для сопровождения и просто более приятным на вид.

person underscoreC    schedule 27.10.2018
comment
Я пробовал подход с from pygame.constants import, но затем в этой строке я получаю ошибки pylint. Мне помогло изменение его на from pygame.event import - person Sandro4912; 26.08.2020

Для конкретного двоичного модуля вы можете добавить его в белый список для pylint. Для модуля pygame это будет следующим образом:

{
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=pygame"
    ]
}
person kipkemoi    schedule 28.06.2019

OP Вы также можете сохранить исправление pygame pylint, которое вы нашли в vscode, включив самостоятельно аргументы vscode по умолчанию. Линтер сходит с ума (crazy_pylint.png), потому что вы затирали аргументы pylint по умолчанию своим собственным python.linting.pylintArgs. Исправление игнорирования модуля pygame действительно работает, и линтер может вернуться в не сумасшедший режим, также включив затертые аргументы по умолчанию в ваш собственный пользовательский python.linting.pylintArgs.

Из документов:

Эти аргументы передаются всякий раз, когда для python.linting.pylintUseMinimalCheckers установлено значение true (по умолчанию). Если вы указываете значение в pylintArgs или используете файл конфигурации Pylint (см. Следующий раздел), тогда для pylintUseMinimalCheckers неявно устанавливается значение false.

По умолчанию vscode проходит в соответствии с этим: https://code.visualstudio.com/docs/python/linting:

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

Итак, вот как передать все эти значения по умолчанию, а также --ignored-modules=pygame в пользовательских настройках в vscode:

    "python.linting.pylintArgs": [
        "--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",
        "--ignored-modules=pygame"
    ]

Согласно комментарию @C_ выше, он определенно говорит правду; линтер поможет!

Я точно пишу лучший код с включенным.

Кроме того, я обнаружил, что вы можете дополнительно настроить свой pylinter с помощью строки включения и разделенных запятыми "читаемых сообщений pylint", перечисленных здесь: https://github.com/janjur/readable-pylint-messages/blob/master/README.md

Чтобы не игнорировать и завершающие символы новой строки, вы должны добавить аргумент списка enable=, чтобы включить просто trailing-newlines.

Я очень надеюсь, что это поможет вам OP :) Мне это помогло!

Спасибо, что задали вопрос и поделились --ignored-modules.

person grymmjack    schedule 02.02.2019