2014-10-26 10 views
7

Sagen wir, ich habe einen Enumerator, ist es möglich, die folgende Eigenschaft zu erhalten? Also, wenn ich today=Days.Sunday hätte, wäre ich in der Lage, etwas wie tomorrow=today.next() zu tun?Nächste Enumeratorkonstante/Eigenschaft abrufen

Beispiel:

class Days(Enum): 
    Sunday = 'S' 
    Monday = 'M' 
    ... 
    Saturday = 'Sa' 

Ich weiß, ich Tupeln verwenden könnte (wie unten) so etwas wie tomorrow=today[1] zu tun, aber ich hatte gehofft, dass es etwas in oder eleganter gebaut war.

class Days(Enum): 
    Sunday = ('S','Monday') 
    Monday = ('M','Tuesday') 
    ... 
    Saturday = ('Sa','Sunday') 
+1

eine Art von Iterator erstellen? –

+0

Dank @PadraicCunningham, wäre das effizienter als die Tupel-Lösung, die ich habe? Ich mag deine mehr, ich bin nur neugierig, ob es Speicher sparen oder Zeit laufen würde :) – Parker

Antwort

7

Absolut.

Fügen Sie einfach die gewünschte Funktionalität zu Ihrer Days Klasse:

class Days(Enum): 

    Sunday = 'S' 
    Monday = 'M' 
    Tuesday = 'T' 
    Wednesday = 'W' 
    Thursday = 'Th' 
    Friday = 'F' 
    Saturday = 'Sa' 

    def next(self): 
     cls = self.__class__ 
     members = list(cls) 
     index = members.index(self) + 1 
     if index >= len(members): 
      index = 0 
     return members[index] 

und Verwendung:

today = Days.Wednesday 
print(today.next()) 
# Days.Thursday 
2

können Sie ein Wörterbuch erstellen, wie am nächsten Tag zum Nachschlagen so:

In [10]: class Days(Enum): 
    Sun = 'Su' 
    Mon = 'M' 
    Tue = 'Tu' 
    Wed = 'W' 
    Thu = 'Th' 
    Fri = 'F' 
    Sat = 'Sa' 

In [11]: days = list(Days) 

In [12]: nxt = dict((day, days[(i+1) % len(days)]) for i, day in enumerate(days)) 

Schnelltest:

In [13]: nxt[Days.Tue] 
Out[13]: <Days.Wed: 'W'> 

In [14]: nxt[Days.Sat] 
Out[14]: <Days.Sun: 'Su'>