Вот упрощенный пример того, что я пытаюсь сделать:
Код: Выделить всё
from dataclasses import dataclass
from enum import Enum
from typing import Annotated
from annotated_types import Predicate
class WildAnimals(Enum):
LION = 'lion'
BEAR = 'bear'
class PetAnimals(Enum):
CAT = 'cat'
DOG = 'dog'
def ConstrainedType(allowed_values: type[Enum]):
return Annotated[
str,
Predicate(lambda val: val in (m.value for m in allowed_values)),
f'Allowed: {list(allowed_values)}',
]
def ConstrainedContainer(allowed_values: type[Enum]):
CType = ConstrainedType(allowed_values)
@dataclass
class Container:
# error: Variable not allowed in type expression (reportInvalidTypeForm)
animal: CType
count: int
return Container
PetCarrier = ConstrainedContainer(PetAnimals)
WildCarrier = ConstrainedContainer(WildAnimals)
example.py:29:17 - ошибка: переменная не разрешена в выражении типа (reportInvalidTypeForm)
Если вместо этого я попытаюсь встроить ConstrainedType(), я получу эту ошибку:
example.py:29:17 - ошибка: выражение вызова не разрешено в выражении типа (reportInvalidTypeForm)
Что мне здесь не хватает? Нужно ли мне как-то использовать TypeVar или Generic? Есть ли способ иметь параметризованные типы, которые не являются «переменными», чтобы средство проверки типов могло их понимать?
Подробнее здесь: https://stackoverflow.com/questions/785 ... ized-typin
Мобильная версия