Код: Выделить всё
from typing import TypeVar
from typing_extensions import TypeGuard
_T = TypeVar('_T', str, int)
def is_str(val: _T) -> TypeGuard[str]:
return isinstance(val, str)
def is_int(val: _T) -> TypeGuard[int]:
return isinstance(val, int)
def process_str_int(data: _T) -> _T:
if is_str(data):
# At this point, `data` is narrowed down to `list[str]`
print("Returning a string")
return data
elif is_int(data):
print("Returning an int")
return data
def process_str_int_with_isinstance(data: _T) -> _T:
if isinstance(data, str):
# At this point, `data` is narrowed down to `list[str]`
print("Returning a string")
return data
elif isinstance(data, int):
print("Returning an int")
return data
process_str_int("hello")
Этого не происходит с isinstance, где TypeVar правильно сужается и, таким образом, выводится правильный тип возвращаемого значения и сопоставляется с возвращаемым значением.Как я могу добиться аналогичного поведения, используя защиту настраиваемого типа?
Подробнее здесь: https://stackoverflow.com/questions/774 ... -a-typevar