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

时间:2017-08-02 11:01:50

标签: python dictionary enums mixins

以下是代码:

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'] + "'")

这是输出(Python 3.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'有效。

是字符串&#34; e1&#34;转换为&#34; EFoo&#34;实例? Python是否进行了一些反向查找以找到要转换为的正确枚举值?

此外,如果您删除str作为类的父级,以便类声明看起来像class EFoo(Enum):,则上面的代码段不再起作用 在这种情况下,从str继承的确是什么?

2 个答案:

答案 0 :(得分:3)

EFoo继承自str,因此它是str - 这就是继承的工作原理。由于EFoo继承自str,其所有成员均为str以及Efoo,因此标准str操作有效:

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

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

答案 1 :(得分:0)

我猜测枚举会继承str魔术方法,所以:

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

输出:

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

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