«Переменная не разрешена в выражении типа» — как создать параметризованную типизацию. Аннотированные типы?Python

Программы на Python
Ответить
Anonymous
 «Переменная не разрешена в выражении типа» — как создать параметризованную типизацию. Аннотированные типы?

Сообщение Anonymous »

Я не уверен, возможно ли это в Python, но я хотел бы создать серию связанных типов.Аннотированный, ссылающихся на один и тот же базовый тип, но где каждый из них ограничен различным набором значений (в идеале с использованием перечислений, но это не имеет решающего значения) и аннотирован метаданными о том, что он принимает. Я мог бы указать их все вручную, но было бы чище, если бы это можно было параметризовать.
Вот упрощенный пример того, что я пытаюсь сделать:

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

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)
Насколько я могу судить, этот код работает нормально (как и должно быть, поскольку подсказки типов не являются обязательными), но Pyright возражает против строки 29, где я назначаю CType в качестве типа для животного:

example.py:29:17 - ошибка: переменная не разрешена в выражении типа (reportInvalidTypeForm)

Если вместо этого я попытаюсь встроить ConstrainedType(), я получу эту ошибку:

example.py:29:17 - ошибка: выражение вызова не разрешено в выражении типа (reportInvalidTypeForm)

Что мне здесь не хватает? Нужно ли мне как-то использовать TypeVar или Generic? Есть ли способ иметь параметризованные типы, которые не являются «переменными», чтобы средство проверки типов могло их понимать?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ized-typin
Ответить

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

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

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

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

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