Сначала я немного напишу о том, что mypy видит и сообщает, а затем задаюсь вопросом, является ли это ошибкой mypy.
Сообщение:
Incompatible return value type (got "Enum1", expected "Enum2")
означает здесь, что примерно что Enum2
или подтип этого ожидается. Enum2
является объявленным возвращаемым значением get_another_enum()
. Однако mypy считает, что вызов функции _enum_to_num()
возвращает тип Enum1
.
«Примерно» это связано с тем, что существуют исключения для проверки типов, когда тип не связан или имеет тип Any
или Union
; но это не относится к этому примеру.
Mypy решает, что функция cast_enum()
в _enum_to_num()
возвращает первый тип, указанный в Enums
- я думаю, что в качестве проверки типа * stati c, она должна выбрать один, и это то, что он делает.
Так что если вы измените порядок в назначении Enums
и напишите:
Enums = TypeVar("Enums", Enum2, Enum1) # Case 2... error: Incompatible return value
Тогда строка 35 будет успешной, но возврат в get_some_enum()
завершится ошибкой с сообщением:
error: Incompatible return value type (got "Enum2", expected "Enum1")
Что касается того, является ли это ошибкой mypy, трудно сказать ...
Нет ошибки типа dynamici c, которую можно найти здесь, используя type()
или ininstance()
функции; работает код работает так же, как и ожидалось.
С другой стороны, Python никогда не проверяет тип возвращаемого значения ни во время компиляции, ни во время выполнения: вы можете изменить тип возвращаемого значения _enum_to_none()
на None
, и он все равно будет действителен как Что касается интерпретатора Python.
Тогда возникает вопрос: в системе типов stati c, навязанной mypy, это ошибка? (Я не думаю, что PEP 484, 526 или другие номера пытаются решить эту проблему).
Кто-то более квалифицированный должен ответить на вопрос, является ли это ошибкой, которая должна быть обнаружена анализатором stati c, в частности mypy.
См. Ответ Кена Хунга, чтобы узнать, как это сделать. более явным и удалите ошибку mypy.