以下是代码:
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
继承的确是什么?
答案 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
获取字符串参数并将其与其中一个键匹配。