Как сузить типы в Python с помощью EnumPython

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

Сообщение Anonymous »

В Python рассмотрим следующий пример

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

from enum import StrEnum
from typing import Literal, overload

class A(StrEnum):
X = "X"
Y = "Y"

class X: ...
class Y: ...

@overload
def enum_to_cls(var: Literal[A.X]) -> type[X]: ...

@overload
def enum_to_cls(var: Literal[A.Y]) -> type[Y]: ...

def enum_to_cls(var: A) -> type[X] | type[Y]:
match var:
case A.X:
return X
case A.Y:
return Y
case _:
raise ValueError(f"Unknown enum value: {var}")
Когда я пытаюсь вызвать enum_to_cls, я получаю ошибку типа в следующем случае:

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

selected_enum = random.choice([x for x in A])
enum_to_cls(selected_enum)

# Argument of type "A" cannot be assigned to parameter "var" of type "Literal[A.Y]" in
# function "enum_to_cls"
# "A" is not assignable to type "Literal[A.Y]" [reportArgumentType]
Я понимаю ошибку, и она имеет смысл, но я хотел знать, есть ли способ избежать этой ошибки. Я знаю, что могу избежать этой ошибки, создавая ветвь для каждого случая перечисления, но затем я возвращаюсь к исходной точке, почему я хотел создать функцию enum_to_cls.


Подробнее здесь: https://stackoverflow.com/questions/793 ... -with-enum
Ответить

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

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

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

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

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