我想创建一个类,该类具有枚举作为属性。这个枚举应该有一个字符串表示形式,当将使用枚举属性的类的实例转储为JSON字符串时,它会显示为人类可读的值。
在下面的最小工作示例中,我以三种不同的方式创建了三个枚举。
在反序列化之后,每个属性都表明它来自一个枚举,除了具有字符串表示的枚举。它只是一个字符串。
如果无法实现这样的结构,我想知道原因。
要求
如果您想进行测试,则必须安装jsons
和attrs
。
pip install attrs jsons
最简工作示例
这里是一个最简工作示例。
import jsons
import attr
from enum import Enum
# ----------------------------------------------------
# create enumeration with the help of a dictionary
fruits = {
"PINEAPPLE": "PINEAPPLE",
"APPLE": "APPLE",
"ORANGE": "ORANGE",
"BANANA": "BANANA",
}
Fruit = Enum("FRUITS", fruits)
# ----------------------------------------------------
# create a classical enumeration
class Nut(Enum):
PEANUT = 1
HAZELNUT = 2
CASHEW = 3
WALNUT = 4
# ----------------------------------------------------
# create enumeration with a string representation
class Vegetable(str, Enum):
BROCCOLI = "BROCCOLI"
CUCUMBER = "CUCUMBER"
POTATO = "POTATO"
ONION = "ONION"
# ----------------------------------------------------
# create a class which uses the enumerations
@attr.s(auto_attribs=True, kw_only=True)
class Order(jsons.JsonSerializable):
fruit: Fruit
nut: Nut
vegetable: Vegetable
# ----------------------------------------------------
# initialize an order object, serialize and deserialize it
order = Order(fruit=Fruit.APPLE, nut=Nut.PEANUT, vegetable=Vegetable.CUCUMBER)
json_string: str = Order.dumps(order)
order_deserialised: Order = Order.loads(json_string)
order
和 order_deserialised
变量的结构:
order: Order(fruit=<FRUITS.APPLE: 'APPLE'>, nut=<Nut.PEANUT: 1>, vegetable=<Vegetable.CUCUMBER: 'CUCUMBER'>)
order_deserialised: Order(fruit=<FRUITS.APPLE: 'APPLE'>, nut=<Nut.PEANUT: 1>, vegetable='CUCUMBER')
正如您所看到的,order_deserialised
将蔬菜显示为字符串而不是枚举。
str
???class Vegetable(str, Enum):
?这可能会影响到attrs
/jsons
库,我怀疑某处有一个检查isinstance(x, str)
,而它没有处理str
的子类型... "使用字符串表示创建枚举" 这不是一个合理的做法。只需编写一个__str__
和一个__repr__
方法即可。继承str
似乎是你的问题所在。你的枚举是一个字符串,这就是继承str
的作用,因此它被视为字符串并不奇怪。 - juanpa.arrivillagastr
想要实现什么目标? - juanpa.arrivillagastr
,因此class Vegetable(Enum):...
- juanpa.arrivillaga