如何为枚举对象实现增量函数? [复制]

Posted

技术标签:

【中文标题】如何为枚举对象实现增量函数? [复制]【英文标题】:How can I implement an increment function for enum objects? [duplicate] 【发布时间】:2017-07-25 06:05:13 【问题描述】:

我正在使用 Dyson 风扇并正在尝试编写一个增加风扇速度的函数。枚举对象 FanSpeed 具有以下成员。当我执行 [print(i) for i in FanSpeed] 时,我得到:

FanSpeed.FAN_SPEED_1
FanSpeed.FAN_SPEED_2
FanSpeed.FAN_SPEED_3
FanSpeed.FAN_SPEED_4
FanSpeed.FAN_SPEED_5
FanSpeed.FAN_SPEED_6
FanSpeed.FAN_SPEED_7
FanSpeed.FAN_SPEED_8
FanSpeed.FAN_SPEED_9
FanSpeed.FAN_SPEED_10

所以第一个枚举对象(上图)的名称为 FAN_SPEED_1 (FanSpeed.FAN_SPEED_1.name),值为“0001”(FanSpeed.FAN_SPEED_1.value),依此类推。

设置速度的函数(本例为5):

fan.set_configuration(fan_mode=FanMode.FAN, fan_speed=FanSpeed.FAN_SPEED_5)

我不知道如何编写一个获取当前速度然后将其设置为更高级别的函数。我试过了:

1/ 将枚举对象视为字符串,并将最后一个字符替换为更高的数字(字符类型)。但这种方法不适用于枚举对象。

2/ 寻找某种增量或下一个函数,但枚举对象似乎不存在这些函数。

【问题讨论】:

如何从风扇配置访问当前速度?您可以在列表中搜索此结果的索引,然后增加/减少 1 或更多 另一个副本,但使用不同的技术:Get next enumerator constant/property 就个人而言,我发现这个问题和答案比被引用为重复的问题更简洁,更容易理解。 【参考方案1】:

让我们使用 Python 文档中的示例:

from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

current_color = Color.RED
new_color = Color(current_color.value + 1)
>>> new_color == Color.GREEN
True

谢谢,我还没有玩过 Enum 类型,所以这是一次很好的学习体验。

如果您想对非 int 值执行此操作,您可以执行以下操作:

class Color(Enum):
    red = "0001"
    blue = "0002"


def get_next_color(current_color):
    current_color_idx = list(Color).index(current_color)
    next_color_idx = (current_color_idx + 1) % len(Color)
    next_color = list(Color)[next_color_idx]
    return next_color

【讨论】:

谢谢,让它工作。小注意 - 值是像“0001”这样的字符串,所以我必须取最后一个字符,转换为int,增加1,然后加回“000”。除此之外,答案是完美的.. 不错的答案,请投赞成票。 :) 谢谢。我喜欢原版的答案,因为它适用于所有情况,尤其是这个。 @marlonmisra 我几乎提供了答案,但我不确定这是否是问题所在。即使我喜欢我的解决方案,我也会选择其他答案。我很惊讶这不是内置方法。 其中一个问题是它对溢出很敏感(递增 BLUE 会产生值错误)。为了我的需要,我想环绕,所以我使用了new_color = Color((current_color.value + 1) % len(Color))。或者,您可以选择仅增加 if current_color != Color.BLUE 当枚举值不是整数时,有没有好的方法可以做到这一点?

以上是关于如何为枚举对象实现增量函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java枚举是不是有增量运算符++? [复制]

如何为对象定义枚举属性?

[小技巧]C#中如何为枚举类型添加描述方法

System.Text.Json:如何为枚举值指定自定义名称?

如何为 C# 中的枚举类型应用 InterLocked.Exchange?

在 Django 中,如何为 IntegerChoices 枚举定义字符串值?