Сужение типа Python с помощью TypeGuard: сужение возвращаемого типа, являющегося TypeVarPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сужение типа Python с помощью TypeGuard: сужение возвращаемого типа, являющегося TypeVar

Сообщение Anonymous »

Рассмотрим следующий случай:

Код: Выделить всё

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")
В момент возврата в Process_str_int я получаю сообщение об ошибке в Pyright, жалующееся, что «Выражение типа «str» не может быть присвоено возвращаемому типу «_T@process_list»» ( и аналогично для случая int). Интерпретатором Python является Python 3.9.
Этого не происходит с isinstance, где TypeVar правильно сужается и, таким образом, выводится правильный тип возвращаемого значения и сопоставляется с возвращаемым значением.Как я могу добиться аналогичного поведения, используя защиту настраиваемого типа?

Подробнее здесь: https://stackoverflow.com/questions/774 ... -a-typevar
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»