Перечисление классов данных работает, но замороженные атрибуты — нет.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Перечисление классов данных работает, но замороженные атрибуты — нет.

Сообщение Anonymous »

Встроенное перечисление позволяет создавать перечисления примитивных типов (IntEnum, StrEnum).
Я хотел бы создать перечисление структурированных объектов.
Один из способов сделать это — использовать класс данных, и он работает:

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

from dataclasses import dataclass
from enum import Enum

from typing_extensions import assert_never

@dataclass(frozen=True)
class _BaseInstTypeDataclass:
instance_type: str
display_name: str

class InstTypeDataClass(_BaseInstTypeDataclass, Enum):
t2_micro = ("t2.micro", "t2.micro: Cheap!")
r7i_2xlarge = ("r7i.2xlarge", "r7i.2xlarge: Expensive!")

assert list(InstTypeDataClass) == [
InstTypeDataClass.t2_micro,
InstTypeDataClass.r7i_2xlarge,
]
assert isinstance(InstTypeDataClass.t2_micro, InstTypeDataClass)

# This function type checks
def f_dataclass(e: InstTypeDataClass):
if e == InstTypeDataClass.t2_micro:
...
elif e == InstTypeDataClass.r7i_2xlarge:
...
else:
assert_never(e)
Как статическое (через пирайт), так и поведение во время выполнения соответствует ожиданиям.
Однако с attrs...:

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

import attrs

@attrs.define(frozen=True)
class _BaseInstTypeAttrs:
instance_type: str
display_name: str

class InstTypeAttrs(_BaseInstTypeAttrs, Enum):
t2_micro = ("t2.micro", "t2.micro: Cheap!")
r7i_2xlarge = ("r7i.2xlarge", "r7i.2xlarge: Expensive!")

# This function type checks
def f_attrs(e: InstTypeAttrs):
if e == InstTypeAttrs.t2_micro:
...
elif e == InstTypeAttrs.r7i_2xlarge:
...
else:
assert_never(e)
... средство проверки типов работает, но во время выполнения...:

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

$ python foo.py
_BaseInstTypeDataclass(instance_type='foo', display_name='bar')
Traceback (most recent call last):
File "foo.py", line 58, in 
class InstTypeAttrs(_BaseInstTypeAttrs, Enum):
File "/Users/.../python3.10/enum.py", line 287, in __new__
enum_member._value_ = value
File "/Users/.../python3.10/site-packages/attr/_make.py", line 551, in _frozen_setattrs
raise FrozenInstanceError()
attr.exceptions.FrozenInstanceError
Это потому, что... Enum и attrs.define(frozen=True) работают не очень хорошо...?

Подробнее здесь: https://stackoverflow.com/questions/791 ... trs-doesnt
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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