json.dumps()使用自定义__new__将StrEnum编码为空字符串



我有一个类似于以下的枚举:

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)

最新更新