具有多个属性的枚举作为集合常量

3
在最近的一个问题中 (Gathering numerical data from a string input),我在想这是否是一个可接受的答案。我认为这会更好地成为一个问题。这种表示方式作为常量集合是否可接受?或者它是枚举的误用吗?在Python中将相同的值分配给不同属性是否会有任何意外后果?
from enum import Enum
class CreditRating(Enum):
     AAA = 0.01
     A = 0.1
     B = 0.1
creditRate = input("Please enter credit rating:")
print(CreditRating[creditRate].value)
1个回答

2
枚举是唯一名称和唯一值之间的关联。支持多次使用一个值,但可能不是您想要的意思。这在文档中明确说明了,请参见 重复枚举成员和值 部分

允许两个枚举成员具有相同的值。给定两个值相同的成员 A 和 B(并且 A 定义在前面),B 是 A 的别名。

因此,通过值查找名称时,只会返回第一个名称:
>>> CreditRating(0.1)
<CreditRating.A: 0.1>

当你查看B时,会给你提供A枚举对象:

>>> CreditRating.B
<CreditRating.A: 0.1>

如果您只想将字符串映射到一个值,我不会使用枚举,而是使用字典:
credit_ratings = {
    'AAA': 0.01, 
    'A': 0.1,
    'B': 0.1,
}
# ...
print(credit_ratings[creditRate])

当您需要其他功能时,例如显式别名、枚举值为单例(您可以使用is测试它们)以及您可以将名称和值映射回枚举对象时,请使用enum

我经常希望使用Enumpydantic一起定义JSON的str选择,然后在应用程序中使用枚举。在这种情况下,提供'{"credit_rating":"AAA"}'并让Pydantic将其转换为assert input.credit_rating.value == 0.01。但是似乎Python和Pydantic密谋在一起,即使在不同版本的Python和现在的Pydantic 2之后进行了几次Enum改进,我仍然无法直接做到这一点,我必须执行以下操作:https://dev59.com/UX8RtIcB2Jgan1znAPLa 这肯定是一个常见的用例。 - NeilG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接