Следующий код хранится в файле с именем sample.py.
import re
from typing import Optional, Tuple
def func(path: str) -> Optional[Tuple[str, str]]:
regex = re.compile(r"/'([^/']+?)'/'([^/']+?)'")
try:
return regex.match(path).groups()
except AttributeError:
return None
Линтер Mypy Python выдает следующую ошибку при анализе кода:
sample.py:8: error: Incompatible return value type (got "Union[Sequence[str], Any]", expected "Optional[Tuple[str, str]]")
sample.py:8: error: Item "None" of "Optional[Match[str]]" has no attribute "groups"
Хотя regex.match(path).groups()
может возвращать тип None
, который не имеет атрибута groups
, результирующее исключение обрабатывается, и обработка указывается в возвращаемом типе. Однако Mypy, похоже, не понимает, что обрабатывается исключение. Насколько я понимаю, Optional[Tuple[str, str]]
является правильным типом возвращаемого значения, а Mypy вместо этого настаивает на том, что менее конкретный тип Union[Sequence[str], Any]
является правильным. Как правильно использовать обработку исключений при вводе Python? (Обратите внимание, что я не прошу альтернативных способов написания кода без использования обработки исключений. Я просто пытаюсь предоставить минимальный и полный пример, в котором средства проверки типов Python ведут себя не так, как я ожидал, при обработке исключений.)