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