2016-03-24 7 views
1

Ich möchte eine enum mit vordefinierten Konstanten für einzelne Zeichen (gut für die Speicherung in der Datenbank) und String-Interpretation. Hier ist, was ich denke an:Python 2: Was ist die eleganteste/pythonischste Art, ein Enum mit String-Interpretationen zu machen?

class Fruits(Enum): 
    APPLE = 'A' 
    PEAR = 'P' 
    BANANA = 'B' 
    def __unicode__(self): 
     if self == APPLE: return "Crunchy Apple" 
     if self == PEAR: return "Sweet Pear" 
     if self == BANANA: return "Long Banana" 

Aber

fruit = Fruits.APPLE 
print fruit.__unicode__() 

gibt

AttributeError: 'unicode' object has no attribute '__unicode__' 

Und außerdem gibt es eine elegantere Möglichkeit sein, es zu tun

vorgehen es besser?

+0

Sie scheinen Python2 zu verwenden. Können Sie bestätigen, ob Sie Python2 oder Python3 verwenden? (Sie können 'sys.version' überprüfen, um sicher zu sein.) –

+0

Woher kam 'Fruits.TYPE_APPLE'? Sie haben nur 'Fruits.APPLE' definiert. Wenn Sie den Code in der Frage aus dem Speicher erneut eingegeben haben, kopieren Sie ihn aus einer Datei, die Sie tatsächlich ausgeführt haben, oder fügen Sie ihn beim nächsten Mal in eine tatsächliche interaktive Sitzung ein. – user2357112

+0

@Rob Ich bin mehr interessiert an Python 2 – Digital

Antwort

-1

Das enum34 Modul hat, was Sie wollen.

from enum import Enum 

class Fruits(Enum): 
    apple = 'A' 
    pear = 'P' 
    banana = 'B' 

fruit = Fruits.apple 

print fruit.value 
>> 'A' 

Möglicherweise noch besser wird mit ganzen Zahlen

from enum import Enum 

class Fruits(Enum): 
    apple = 1 
    pear = 2 
    banana = 3 

fruit = Fruits.apple 

print fruit.value 
>> 1 

und das Objekt neu erstellen, wenn Sie es Wert zu erhalten (aus einer Datenbank zum Beispiel) mit:

fruit = Fruits(1) 
+0

Dies beantwortet die Frage des OP nicht. –

+0

Ah du bist eigentlich richtig, denke ich. Aber es gibt auch fruit.name für die angeforderte Stechinterpretation. –

3

Ein paar Beobachtungen:

  • Sie sollten __dunder__ Methoden nicht direkt aufrufen; verwenden Sie stattdessen den passenden Befehl: unicode statt __unicode__

  • ich nicht in der Lage bin Ihr Problem

Mit der stdlib Enum (3.4+) oder die enum34 backport (Python 2.x) duplizieren Sie zu tun haben, es auf die harte Tour - Ihre eigene Basis Enum Klasse machen:

class EnumWithDescription(Enum): 
    def __new__(cls, value, desc): 
     member = object.__new__(cls) 
     member._value_ = value 
     member.description = desc 
     return member 
    def __unicode__(self): 
     return self.description 

class Fruits(EnumWithDescription): 
    _order_ = 'APPLE PEAR BANANA' # if using Python 2.x and order matters 
    APPLE = 'A', 'Crunchy Apple' 
    PEAR = 'P', 'Sweet Pear' 
    BANANA = 'B', 'Long Banana' 

und im Einsatz:


Wenn Sie verwenden können, die aenum library Sie eine einfachere Zeit davon haben:

from aenum import Enum 

class Fruits(Enum, init='value description'): 
    APPLE = 'A', 'Crunchy Apple' 
    PEAR = 'P', 'Sweet Pear' 
    BANANA = 'B', 'Long Banana' 
    def describe(self): 
     return self.description 

und im Einsatz:

fruit = Fruits.APPLE 
fruit.describe() 

Beachten Sie, dass seit unicode ist die Standard in Python 3 Ich änderte den Namen in describe.


Disclosure: Ich bin der Autor des Python stdlib Enum, die enum34 backport und die Advanced Enumeration (aenum) Bibliothek.

Verwandte Themen