2017-08-02 52 views
2

下面是代碼: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'] + "'") 

這裏是輸出(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',它通過一個字符串鍵訪問字典的作品。

字符串「e1」是否轉換爲「EFoo」實例? Python會做一些反向查找來找到正確的枚舉值來轉換爲?

此外,如果您刪除str作爲類的父,使類的聲明看起來像class EFoo(Enum):,上面的代碼片斷不工作了 是什麼從str繼承正好在這種情況下怎麼辦?

回答

-1

我猜枚舉繼承str魔術方法,所以:

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

輸出:

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

我想這將允許dict採取一個字符串參數,並匹配到一個的鑰匙。

1

EFoo繼承自str,所以它是str - 這就是繼承的工作原理。因爲從strEFoo繼承所有的成員都str S以及Efoo S,所以標準str操作的工作:

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

str(或任何其他基本類型)繼承並刪除一些內置於Enum安全設備的,所以你應該只在必要時做到這一點(比如在你的代碼中已經存在這種類型的常量)。

相關問題