Пример из реальной жизни: Порту может быть назначена VLAN или список VLAN, или он может быть определен как магистральный, или может быть нераспределенным.
Нам нужны константы для «магистрального», «нераспределенного». Определением VLAN является класс VlanId(int): ...
Нам также нужны определения типов для функций аннотирования типов, например:
- возвращает одну VLAN или «магистраль» (список VLAN или «нераспределенный» список не допускается)
Код: Выделить всё
get_init_port_value()
- возвращает текущие выделения на данном порту
Код: Выделить всё
get_port_status(port)
Код: Выделить всё
Trunk = Literal["trunk"]
TRUNK = "trunk" # TRUNK type becomes Literal[“trunk”]
# NB, TRUNK: Trunk = “trunk” provides the exact same thing.
Unallocated = Literal["unallocated"]
UNALLOCATED = "unallocated" # UNALLOCATED type becomes Literal[“unallocated”]
PortVlanAllocation = VlanId | list[VlanId] | Trunk | Unallocated
def get_init_port_value() -> VlanId | Trunk: ...
def get_port_status(port: Port) -> PortVlanAllocation: ...
Код: Выделить всё
..
TRUNK: Final = "trunk" # TRUNK type becomes Literal[“trunk”]
..
Код: Выделить всё
..
PortVlanAllocation = VlanId | list[VlanId] | Type[TRUNK] | Type[UNALLOCATED]
..
Код: Выделить всё
..
PortVlanAllocation = VlanId | list[VlanId] | Literal[TRUNK] | Literal[UNALLOCATED]
..
Код: Выделить всё
class NonVlanAlloc(enum.Enum):
TRUNK = "trunk"
UNALLOCATED = "unallocated"
PortVlanAllocation = NonVlanAlloc | VlanId | list[VlanId]
def get_init_port_value() -> Literal[NonVlanAlloc.TRUNK] | VlanId: ...
Код: Выделить всё
return NonVlanAlloc.UNALLOCATED # Incompatible return value type (got "Literal[NonVlanAlloc.UNALLOCATED]", expected "Union[Literal[NonVlanAlloc.TRUNK], VlanId]")
return "trunk" # Incompatible return value type (got "Literal['trunk']", expected "Union[Literal[NonVlanAlloc.TRUNK], VlanId]")
return NonVlanAlloc.TRUNK # OK
return 42 # Incompatible return value type (got "Literal[42]", expected "Union[Literal[NonVlanAlloc.TRUNK], VlanId]")
return VlanId(2345789789) # OK
Интересно, есть ли способ получить тип TRUNK (без отдельного явного определения) , то есть то, чего я хотел достичь в Try3 и Try4 (и вроде как достиг в Try5). Это противоположно получению литерала из типа Literal в Python во время выполнения?, потому что
- они объявляют типы и определяют значения,
li>
пока я объявляю значения (константы) и выясняю их типы (например, для аннотаций функций).
Подробнее здесь: https://stackoverflow.com/questions/763 ... nnotations