【问题标题】:Get next enumerator constant/property获取下一个枚举数常量/属性
【发布时间】:2014-12-22 01:04:35
【问题描述】:

假设我有一个枚举器,是否可以获得以下属性?所以如果我有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')

【问题讨论】:

  • 创建某种迭代器?
  • 谢谢@PadraicCunningham,这会比我的元组解决方案更有效吗?我更喜欢你的,我只是好奇它是否会节省内存或运行时间:)

标签: python python-3.x enums enumeration


【解决方案1】:

当然。

只需将所需的功能添加到您的 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

虽然上述内容可能更容易理解,但可以通过向每个成员添加 next 属性(以及在我们使用它时为 previous)在 __init__ 中完成一次工作。

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之后的()s。

【讨论】:

    【解决方案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'>
    

    【讨论】:

      【解决方案3】:
      #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
      

      【讨论】:

      • 提高StopIteration 比从__next__() 返回None 更有意义。
      【解决方案4】:

      对我来说,这似乎是没有附加功能的最优雅的解决方案

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

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 2015-08-21
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 2020-12-31
        相关资源
        最近更新 更多