【问题标题】:Augment a Python enum with a value taking parameters使用带参数的值来增强 Python 枚举
【发布时间】:2021-12-21 08:00:19
【问题描述】:

我有一个 Python 枚举:

class E(Enum):
  A = 1
  B = 2

它是公共接口的一部分,人们将E.A 或E.B 传递给各种函数以指定某些参数。我想增加这个枚举以添加第三个值C,但这个值只有在你还传递了几个附加参数x 和y 时才有意义。因此,除了允许我的用户通过E.A 或E.B,我希望他们能够通过例如E.C(x=17,y=42),并让我的代码访问这些参数的值(此处为 17 和 42)。

实现这一目标的最“pythonic”方式是什么?我正在使用 Python 3.7。

【问题讨论】:

    标签: python-3.x enums interface-design


    【解决方案1】:

    没有 Pythonic 方法可以实现这一点,因为您正试图以不同于预期的方式使用 Enum。让我解释一下:

    首先,一个有更多有用名称的枚举:

    class Food(Enum):
        APPLE = 1
        BANANA = 2
        CARROT = 3
    

    每个枚举成员(上面的APPLE 和BANANA)都是一个单例——永远只有一个Food.APPLE、一个Food.BANANA 和一个Food.CARROT(如果你添加的话)。如果您将x 和y 属性添加到Food.CARROT,那么无论您在哪里使用Food.CARROT,您都会看到最后一次设置的x 和y。

    例如,如果func1 用Food.CARROT(17, 19) 调用func2,并且func2 用Food.CARROT(99, 101) 调用func3,那么当func1 重新获得控制权时,它将看到Food.CARROT.x == 99 和Food.CARROT.y == 101。

    解决这个特定问题的方法就是将x 和y 参数添加到您的函数中,并让函数验证它们(就像您对任何其他有限制或要求的参数所做的那样)。

    【讨论】:

    • 感谢您的回答!我不喜欢添加 x 和 y 参数的方法:我需要对添加到这个具有参数的枚举的每个选项都这样做,所以我最终会得到大量的参数列表和很多验证码。难道没有一种合理的方式来实现我想要的接口吗?我不再需要将结果子类化为Enum。
    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多