2015-02-19 16 views
7

Ho una classe che viene essenzialmente utilizzata per definire le costanti comuni per altre classi. Assomiglia al seguente:Ottenere tutte le costanti all'interno di una classe in python

class CommonNames(object): 
    C1 = 'c1' 
    C2 = 'c2' 
    C3 = 'c3' 

E voglio ottenere tutti i valori costanti "pythonically". Se ho usato CommonNames.__dict__.values() ricevo quei valori ('c1', ecc), ma ho altre cose come ad esempio:

[<attribute '__dict__' of 'CommonNames' objects>, 
<attribute '__weakref__' of 'CommonNames' objects>, 
None] 

Il che non voglio.

Voglio essere in grado di prendere tutti i valori perché questo codice verrà modificato in seguito e voglio che altri posti sappiano su tali cambiamenti.

risposta

9

Dovrete filtrare quelli esplicitamente filtrando sui nomi:

[value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')] 

Questo produce un elenco di valori per qualsiasi nome che non inizia con un carattere di sottolineatura:

>>> class CommonNames(object): 
...  C1 = 'c1' 
...  C2 = 'c2' 
...  C3 = 'c3' 
... 
>>> [value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')] 
['c3', 'c2', 'c1'] 

delle enumerazioni come questi, è meglio usare enum34 backport del nuovo enum library aggiunto a Python 3.4:

from enum import Enum 

class CommonNames(Enum): 
    C1 = 'c1' 
    C2 = 'c2' 
    C3 = 'c3' 

values = [e.value for e in CommonNames] 
Problemi correlati