我正在尝试修改 Enum 以默认返回值:
class EnumDirectValueMeta(EnumMeta):
def __getattribute__(cls, name):
try:
return object.__getattribute__(cls, name).value
except AttributeError:
return object.__getattribute__(cls, name)
class Currency(Enum, metaclass=EnumDirectValueMeta):
USD = "USD"
EUR = "EUR"
GBP = "GBP"
这样我就不需要调用
Currency.USD.value
,只需要调用Currency.USD
即可返回"USD"
(默认)。
但是,我总是得到
RecursionError: maximum recursion depth exceeded while calling a Python object
。
还尝试将
__get__
改为 return self.value
或 return str(self.value)
等,同样的事情发生了。我似乎找不到解决递归问题的方法。
有一个优雅的解决方案吗? 谢谢。
编辑:
即使
print(Currency.USD)
打印字符串 USD
还有其他问题。
使用
[ccy for ccy in Currency if ...]
迭代货币项目
返回[Currency.USD, Currency.EUR, Currency.GBP]
不是原意的 ['USD', 'EUR', 'GBP']
。
现在这些列表推导式并不多,我可以用 [ccy.value for ccy in Currency if ...]
解决这个问题,但似乎是不好的做法。
在调试模式下,我可以看到
ccy
具有值 Currency.USD
并且尝试获取 balance[ccy]
会出现错误 KeyError: <Currency.USD: 'USD'>
在我看来基本上与
balance[Currency.USD]
相同,但它工作得很好,就像 balance['USD']
一样,都返回预期值。