Как мне сообщить MyPy, что ошибки в os.path.путь не является ошибками?

#python #visual-studio-code #mypy

#python #visual-studio-code #mypy

Вопрос:

В VS Code на вкладке Проблемы отображаются ошибки при использовании os.path.join , но код фактически выполняется. Как мне сообщить MyPy, что это не ошибки?

Я работаю на платформе Salome, и существующий код, который выполняется, показывает следующее как ошибку: (конкретная программа envSalome.py , которая является программой, с которой начинается все шоу Саломеи-меки):

 import os

kernel_root=os.getenv("KERNEL_ROOT_DIR")
kernel_root = os.path.realpath(kernel_root)                 # this is line 39 in the error below
sys.path[:0]=[os.path.join(kernel_root,"bin","salome")]     # this is line 40 in the error below
 

Эта программа работает без ошибок.

Я использовал ссылку на интерпретатор python в левом нижнем углу VS Code, чтобы выбрать python3.exe который поставляется вместе с Salome (и который запускает этот код без ошибок).

Моя проблема:
на вкладке «Проблемы» окна терминала MyPy показывает эти ошибки:

Значение переменной типа «AnyStr» из «realpath» не может быть «Необязательным [str]» mypy (ошибка) [39, 16]

Аргумент 1 для «join» имеет несовместимый тип «Необязательно [str]»; ожидается «Объединение [str, _PathLike[str]]» mypy(ошибка) [40,29]

Комментарии:

1. Я нашел обходной путь: в настройках vs code найдите «linting» и отключите все linters, затем установите pylance от Microsoft, и он будет выполнять linting, даже если он не указан в настройках «linting»: и pylance, похоже, не помечает эти ошибки как ошибки (до сих пор).

Ответ №1:

os.getenv("KERNEL_ROOT_DIR") может возвращать str или None . Вы не принимаете это во внимание, и mypy сообщает вам, что вы не рассмотрели случай, когда он возвращается None .

Если вы ожидаете, что значение всегда будет существовать в среде, я предлагаю использовать функцию, которая не возвращает None , например

 kernel_root=os.environ["KERNEL_ROOT_DIR"]
 

Ответ №2:

MyPy просто делает то, что должен делать: «введите проверку вашего кода и найдите распространенные ошибки.«.

В этом случае ошибка имеет смысл, поскольку os.getenv(key, default=None) возвращает «значение переменной key среды, если оно существует, или значение по умолчанию, если оно не существует».. В случае KERNEL_ROOT_DIR , если переменная среды не определена, os.path realpath либо join функция or вызовет исключение .

Если вы на 100% уверены KERNEL_ROOT_DIR , что переменная всегда будет существовать в среде, в которой вы будете запускать этот код, вы можете сказать MyPy игнорировать эти ошибки. (Мы говорим MyPy игнорировать их, потому что у MyPy нет возможности узнать о вашей платформе Salome или понять, что они не являются ошибками.)

Есть несколько способов.

Способ 1

Вы можете отключить эту конкретную ошибку в этих конкретных строках, добавив специальный # type: ignore[code] комментарий к этой строке:

 kernel_root = os.getenv("KERNEL_ROOT_DIR")
kernel_root = os.path.realpath(kernel_root)  # type: ignore[type-var]
sys.path[:0] = [os.path.join(kernel_root, "bin", "salome")]  # type: ignore[arg-type]
 

Чтобы получить точные коды ошибок MyPy, которые будут отображаться на вкладке проблем VS Code, добавьте в свои настройки следующее.json:

 "python.linting.mypyArgs": [
    "--show-error-codes"
]
 

введите описание изображения здесь

Если вас не волнует поиск конкретных ошибок, и вы просто хотите отключить все ошибки для этой строки, вы можете просто отбросить [code] часть и просто сделать # type: ignore .

Способ 2

Если вы можете изолировать эти строки в определенном модуле, вы можете сказать MyPy игнорировать все ошибки для этого конкретного модуля. Это можно сделать, создав файл конфигурации MyPy, который представляет собой файл mypy.ini или .mypy.ini или setup.cfg, размещенный в корне вашей рабочей области, а затем добавив ignore_errors опцию.

Например, если эти строки являются частью модуля config.py внутри пакета myproject наличие этого файла конфигурации MyPy приведет к отключению этих ошибок:

 [mypy-myproject.config]
ignore_errors = True
 

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

 [mypy]
disable_error_code = type-var
 

Приведенный выше пример игнорирует одну из ошибок:

введите описание изображения здесь

Но обратите внимание, что это также игнорирует другие ошибки в других строках того же модуля.