首页 > 解决方案 > 具有无限/动态成员的枚举

问题描述

摘要:我想要一个(整数)枚举,其中包含一些(负)成员,这些成员对应于特定状态和未绑定(正)成员。

示例:假设我们有一个数据库条目,其中存储了比赛中的获胜位置。如果比赛结束,这些条目是积极的。但是,也有一些特殊值,例如未完成未参加取消资格。这些作为负值存储在数据库中。

现在我想用 Python 来表示这个结构。由于枚举是不可变的,因此这变得相当困难。我已经研究enum.EnumMeta并查看了aenum图书馆,但没有找到解决方案。我最不荒谬的想法是有一个像下面这样的枚举:

import enum

class RankingPlace(enum.IntEnum):
    FINISHED = 0
    DID_NOT_FINISH = -1
    DID_NOT_ATTEND = -2
    DISQUALIFIED = -3

    def __call__(self, value):
        if value < 0:
            return super()(member)
        else:
            member = self.__class__.FINISHED
            member.actual_place = value
            return member

这有点工作,但我必须打电话给一个成员才能让它工作。有没有使用例如自定义元类的更清洁的方法?

标签: pythonenumsmetaclass

解决方案


听起来最好的解决方案是结合Enum其他东西——也许是(使用from的namedtuple示例代码:NamedTupleaenum

class Status(aenum.IntEnum):
    FINISHED = 0
    DID_NOT_FINISH = -1
    DID_NOT_ATTEND = -2
    DISQUALIFIED = -3

class Placement(aenum.NamedTuple):
    race = 0, 'name of race'
    status = 1, 'finished race?'
    placement = 2, 'position when finished'

winner = Placement('2021 Marathon', Status.FINISHED, 1)

推荐阅读