【问题标题】:Combining AutoName and multiple values with Python 3.9 Enum将 AutoName 和多个值与 Python 3.9 枚举相结合
【发布时间】:2021-05-24 03:17:32
【问题描述】:

我正在使用 Python 的 Enum 类(在 Python 3.9 中),并尝试结合他们的 documentation 中的一些东西。 "Planet" example class 演示了一个元组 (mass,radius) 作为枚举成员的值,并在将值传递给重写的 __init__() 方法时基于该值设置其他成员属性。然而,枚举成员的“价值”最终就是那个元组。 AutoName class 显示使用 enum.auto() 辅助函数和重写的 _generate_next_value_() 方法来使用成员的名称作为值。 通常,重写__new__() 方法似乎是设置成员值属性的唯一方法。我很难将这三件事结合起来。

我想要的是类似于 Planet 的东西,除了“值”更改为“名称”,如 AutoName() 中那样,因此 Planet.MERCURY 是“MERCURY”,而不是元组。但是在覆盖__new__() 时,似乎无法知道正在创建的成员的“名称”是什么,因此您无法为其设置“值”。而使用“auto()”,似乎没有办法提供额外的值,比如来自 Planet 的(质量、半径)信息。我希望做这样的事情(假设存在 AutoName 类):

class Planet(AutoName):
    MERCURY = auto(3.303e+23, 2.4397e6)  # doesn't work
    VENUS = (auto(), 4.869e+24, 6.0518e6)  # doesn't work

有没有办法将枚举值的元组与改变成员值的某种方式结合起来,就像 auto() 所做的那样?

【问题讨论】:

    标签: python enums


    【解决方案1】:

    使用 stdlib Enum 是不可能的,但可以使用 aenum1 库:

    from aenum import Enum
    
    class AutoName(Enum):
        def _generate_next_value_(name, start, count, last, *args, **kwds):
            return (name, ) + args
    
    class Planet(AutoName):
        _init_ = 'value mass radius'
        MERCURY = 3.303e+23, 2.4397e6
        VENUS = 4.869e+24, 6.0518e6
    

    _init_ 有两个用途:

    • 指定将给定值保存到哪些属性
    • 如果指定的属性多于给定的属性,请调用 _generate_next_value_ 以尝试创建缺失值

    --

    1 披露:我是Python stdlib Enum、enum34 backport 和Advanced Enumeration (aenum) 库的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多