Почему я получаю 2 сообщения об ошибках при написании кода Python с использованием Visual Studio Code?

У меня много моделей данных в каталоге datamodel /, и я не хочу импортировать их по одному, поэтому я сделал:

from datamodel import *  # pylint:disable=unused-wildcard-import

а дальше я сделал:

datamodel_file.DataModelClass(db_server)

Я получаю следующие ошибки в VS Code:

Undefined variable 'datamodel_file' (pylint(undefined-variable)[22,27]
Undefined variable: 'datamodel_file' (Python(undefined-variable)[22,27]

Несколько проблем с этим:

  1. Я не понимаю, почему VS Code / PyLint считает, что эта переменная не определена, поскольку код работает нормально, когда я его отлаживаю.
  2. Почему появляется 2 сообщения об ошибках?
  3. Я попытался отключить сообщение pylint, чтобы быстро проверить, что происходит, выполнив: datamodel_file.DataModelClass(db_server) # pylint:disable=undefined-variable Это приводит к отключению ошибки из pylint, но другая ошибка из Python все еще остается.

Как мне исправить эту ошибку?


person Denis    schedule 15.05.2019    source источник
comment
Чтобы ответить на ваш первый вопрос: pylint выполняет статический анализ вашего импорта. Он не найдет переменные, требующие выполнения кода для создания переменной. Сюда входят динамически создаваемые переменные и прочее, загружаемое из DLL во время выполнения.   -  person BoarGules    schedule 15.05.2019


Ответы (1)


Использование import * за пределами REPL не рекомендуется из-за ситуаций, подобных этой, когда вы не можете определить в результате самоанализа кода, откуда должно происходить имя. Скорее всего, datamodel указывает datamodel_file каким-то напуганным способом, который Pylint или языковой сервер не могут понять.

Что касается двух предупреждений линтера, это потому, что вы запускаете сразу два инструмента: Pylint и языковой сервер Python, который обеспечивает базовый линтинг. Если вы хотите отключить сервер языка Python, см. документацию по его настройкам.

Но лучший способ решить эту проблему - просто не использовать import *. Либо сделайте import datamodel, а затем используйте datamodel.datamodel_file (или сделайте что-то вроде import datamodel as dm; dm.datamodel_file). Или вы можете использовать from datamodel import datamodel_file.

person Brett Cannon    schedule 17.05.2019