修改Enum默认返回值

问题描述 投票:0回答:1

我正在尝试修改 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']
一样,都返回预期值。

python recursion enums metaclass
1个回答
0
投票

您可以结合

Enum
str
来获得您想要的。有关详细信息,请参阅此答案

© www.soinside.com 2019 - 2024. All rights reserved.