我有一个类似于以下的枚举:
from enum import Enum
class Currencies(str, Enum):
EURO = ("EUR", True)
YEN = ("JPY", False)
supports_decimals: bool
def __new__(cls, value: str, supports_decimals: bool):
obj = super().__new__(cls)
obj._value_ = value
setattr(obj, "supports_decimals", supports_decimals)
return obj
这允许以下内容:
>>> Currencies.EURO.value
'EUR'
>>> Currencies.EURO.supports_decimals
True
>>> f"{Currencies.EURO}"
'EUR'
但是:
>>> import json
>>> json.dumps(Currencies.EUR)
'""'
如果我的枚举有简单的字符串成员而不是元组,但它会导致空字符串,并且由于枚举的成员被视为str
,自定义编码器类根本不会对它们调用.default()
,所以我不能为它们定义自定义编码。
问题可能归结为str.encode()
,因为事实上:
>>> Currencies.EUR.encode()
b''
但即使知道这一点,我也不知道如何指示json.dumps()
使用成员的_value_
。我尝试重写encode()
,这使Currencies.EUR.encode()
工作,但json.dumps()
仍然返回一个空字符串。
请注意,我宁愿将枚举保留为str, Enum
,因为将其转换为简单的枚举会使应用程序的其他部分复杂化。
您的枚举实例是空字符串。obj = super().__new__(cls)
生成一个空字符串实例。
制作一个非空字符串:
obj = super().__new__(cls, value)