2015-11-13 8 views
9

Vorrei creare un tipo di enum in fase di esecuzione leggendo i valori in un file YAML. Così ho questo:Crea dinamicamente un enum con valori personalizzati in Python?

# Fetch the values 
v = {'foo':42, 'bar':24} 

# Create the enum 
e = type('Enum',(), v) 

C'è un modo corretto per farlo? Ritengo che chiamare type non sia una soluzione molto accurata.

+0

io non sono molto sicuro perché è il vostro '' Enum' avendo e.foo' e 'e.bar' attribuisce a tali valori strani assegnati. Non è affatto "Enum"! – Nhor

+0

@Nhor cos'è allora? Sto scrivendo un wrapper da una libreria C in cui ci sono alcune enumerazioni come typedef enum {soda = 3423, flower = 5827, water = 999} articles_t; '(questo è ovviamente un esempio) – nowox

+0

okay scusate il mio male – Nhor

risposta

12

Si può creare un nuovo tipo enum utilizzando Enum functional API:

In [1]: import enum 

In [2]: DynamicEnum = enum.Enum('DynamicEnum', {'foo':42, 'bar':24}) 

In [3]: type(DynamicEnum) 
Out[3]: enum.EnumMeta 

In [4]: DynamicEnum.foo 
Out[4]: <DynamicEnum.foo: 42> 

In [5]: DynamicEnum.bar 
Out[5]: <DynamicEnum.bar: 24> 

In [6]: list(DynamicEnum) 
Out[6]: [<DynamicEnum.foo: 42>, <DynamicEnum.bar: 24>] 
+0

I wish we potrebbe fare qualcosa come 'classe MyEnum (IntEnum): _list = [" A "," B "," C "]' – PascalVKooten

+0

@PascalvKooten come creare il dict come '{nome: indice per indice, nome in enumerare (the_list) } '. Non funziona per la dinamica (non l'ho guardato dentro) ma per statico sarà autonumber. https://repl.it/@altendky/SevereGiftedDuckbillcat – altendky