Как сузить тип литералов с помощью дженериков?Python

Программы на Python
Ответить
Anonymous
 Как сузить тип литералов с помощью дженериков?

Сообщение Anonymous »

Чтобы сузить тип до литеральных типов, я обычно делаю следующее:
from typing import Literal, TypeIs, get_args, reveal_type

type OneTwoThree = Literal[1, 2, 3]
type FourFiveSix = Literal[4, 5, 6]

def is_one_two_three(val: object) -> TypeIs[OneTwoThree]:
return val in get_args(OneTwoThree.__value__)

def is_four_five_six(val: object) -> TypeIs[FourFiveSix]:
return val in get_args(FourFiveSix.__value__)

# Testing

val: int

if is_one_two_three(val):
reveal_type(val) # Revealed type is "Literal[1] | Literal[2] | Literal[3]"
elif is_four_five_six(val):
reveal_type(val) # Revealed type is "Literal[4] | Literal[5] | Literal[6]"
else:
reveal_type(val) # Revealed type is "builtins.int"

Как мне избежать записи функций TypeIs для каждого имеющегося у меня литерала?
Следующее не работает
def is_literal_type[T](val: object, literal: type[T]) -> TypeIs[T]:
return val in get_args(literal.__value__)

val: int

if is_literal_type(val, OneTwoThree):
# Argument 2 to "is_literal_type" has incompatible type "TypeAliasType"; expected "type[Never]"
reveal_type(val)


Подробнее здесь: https://stackoverflow.com/questions/798 ... g-generics
Ответить

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

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

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

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

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