Python mixin枚举作为字典键:如何转换类型?

2024-04-24 12:18:34 发布

您现在位置:Python中文网/ 问答频道 /正文

代码如下:

from enum import Enum

class EFoo(str, Enum):
    A = 'e1'
    B = 'e2'

print(EFoo.A)

d = {
    EFoo.A : 'eA',
    EFoo.B : 'eB'
}

first_key = list(d.keys())[0]
first_key_type = type(first_key)

print("Keys: " + str(d.keys()))
print("Type of first key: " + str(first_key_type))
print("d[EFoo.A] = '" + d[EFoo.A] + "'")
print("d['e1'] = '" + d['e1'] + "'")

下面是输出(Python3.5)

EFoo.A  
Keys: dict_keys([<EFoo.A: 'e1'>, <EFoo.B: 'e2'>])  
Type of first key: <enum 'EFoo'>  
d[EFoo.A] = 'eA'  
d['e1'] = 'eA'  

现在字典键的类型是<enum 'EFoo'>

所以我不明白为什么通过字符串键访问字典的代码d['e1'] = 'eA'起作用。

字符串“e1”是否转换为“EFoo”实例?Python是否做了一些反向查找以找到要转换为的正确枚举值?

此外,如果您将str作为类的父级移除,从而使类声明看起来像class EFoo(Enum):,则上述代码片段将不再工作 在这种情况下,从str继承到底做了什么?


Tags: key代码typeenumkeysclassfirstprint
2条回答

我猜枚举继承了strmagic方法,所以:

print("EFoo.A == 'e1'", EFoo.A == 'e1')
print("EFoo.A == 'e2'", EFoo.A == 'e2')

输出:

EFoo.A == 'e1' True
EFoo.A == 'e2' False

我想这将允许dict获取一个字符串参数并将其与一个键匹配。

EFoo继承自str,因此是str——这就是继承的工作原理。因为EFoo继承自str,它的所有成员都是strs和Efoos,所以标准的str操作工作:

>>> isinstance(EFoo.A, str)
True
>>> EFoo.A.upper()
E1
>>> EFoo.A + EFoo.B
e1e2

str(或任何其他基类型)继承确实会删除Enum中内置的一些安全性,因此您只应在必要时执行此操作(例如替换代码中已存在的该类型的常量)。

相关问题 更多 >