Следующий код был успешно проверен в старой версии mypy (1.17.0), но не выполнен в новой (1.18.2):
Код: Выделить всё
_T = TypeVar('_T')
class Foo(Generic[_T], ABC):
pass
def to_foo(value: _T | Foo[_T],
checker: Callable[[Any], TypeIs[_T]],
factory: Callable[[_T], Foo[_T]]) -> Foo[_T]:
if checker(value):
return factory(value)
else:
return value
Код: Выделить всё
error: Incompatible return value type (got "_T | Foo[_T]", expected "Foo[_T]") [return-value]
Хотя я думал, что это именно то, что делает TypeIs:
Сужение типа применяется как в положительном, так и в отрицательном случае
Когда я уменьшаю проблему далее я получаю следующую функцию, которая по-прежнему не работает:
Код: Выделить всё
_T = TypeVar('_T')
def mypy_fails(x: _T | int, checker: Callable[[Any], TypeIs[_T]], default: int) -> int:
if checker(x):
return default
else:
return x
Код: Выделить всё
def mypy_validates(x: int | _T, checker: Callable[[Any], TypeIs[int]], default: _T) -> _T:
if checker(x):
return default
else:
return x
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-expected
Мобильная версия