获取下一个枚举常量/属性

9 投票
4 回答
1279 浏览
提问于 2025-04-29 19:20

假设我有一个枚举类型,能不能获取下一个属性呢?比如说,如果我有 today=Days.Sunday,我能不能这样做 tomorrow=today.next()

举个例子:

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

我知道我可以使用元组(像下面这样)来实现 tomorrow=today[1],但我希望能有一些内置的或者更优雅的方法。

class Days(Enum):
     Sunday = ('S','Monday')
     Monday = ('M','Tuesday')
     ...
     Saturday = ('Sa','Sunday')
暂无标签

4 个回答

0

对我来说,这看起来是最简单优雅的解决办法,不需要额外的函数。

day = Days.Sunday

day = Days((day.value + 1) % len(Days) + 1) # next day cycled
0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用一个特定的功能时,发现它没有按照预期的方式工作。这种情况很常见,尤其是对于刚开始学习编程的人来说。

当我们在网上寻找解决方案时,StackOverflow是一个非常有用的地方。这里有很多经验丰富的程序员分享他们的知识和经验,帮助其他人解决问题。你可以在这里找到很多关于编程的讨论和解决方案,甚至是一些小技巧,帮助你更好地理解和使用编程工具。

总之,如果你在编程过程中遇到困难,不妨去看看StackOverflow,那里可能有你需要的答案或者灵感。

#ENUM CLASS

#colors
import enum

class Color(enum.Enum):
    turquoise = 1
    indigo = 2
    magenta = 3
    cyan = 4
    teal = 5
    azure = 6
    rose = 7
    amber = 8
    vermillon = 9
    plum = 10
    russet = 11
    slate = 12

    def __iter__(self):
        self.idx_current = self.value
        return self

    def __next__(self):
        if (self.idx_current > 12):
            return None

        self.idx_current = self.idx_current + 1
        return Color (self.idx_current - 1)

#CLIENT CODE
    #iterate colors starting from cyan
    it = iter (Color.cyan)
    while True:
        #print (v.get_id())
        c = next (it)
        if c is None:
            break
        print(c)

#OUTPUT
Color.cyan
Color.teal
Color.azure
Color.rose
Color.amber
Color.vermillon
Color.plum
Color.russet
Color.slate
2

你可以创建一个字典,用来查找第二天的日期,方法如下:

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))

快速测试:

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

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

当然可以。

只需要在你的 Days 类里添加想要的功能:

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]

然后在使用的时候:

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

虽然上面的方式可能更容易理解,但其实可以在 __init__ 里一次性完成这个工作,给每个成员添加一个 next 属性(顺便再加一个 previous 属性)。

class Days(Enum):
    #
    Sunday = 'S'
    Monday = 'M'
    Tuesday = 'T'
    Wednesday = 'W'
    Thursday = 'Th'
    Friday = 'F'
    Saturday = 'Sa'
    #
    def __init__(self, value):
        if len(self.__class__):
            # make links
            all = list(self.__class__)
            first, previous = all[0], all[-1]
            previous.next = self
            self.previous = previous
            self.next = first

然后在使用的时候:

>>> Days.Tuesday.next
<Days.Wednesday: 'W'>

>>> Days.Tuesday.previous
<Days.Monday: 'M'>

>>> Days.Saturday.next
<Days.Sunday: 'S'>

>>> Days.Saturday.previous
<Days.Friday: 'F'>

注意 使用这种属性的方法后,我们就不再需要在 next/previous 后面加上 () 了。

撰写回答