引用另一个枚举作为Python中的枚举值?

时间:2020-09-18 05:37:01

标签: python python-3.x object enums

假设我有一个Python Enum,每个枚举实例应引用同一枚举的另一个实例。我该怎么办?

当我尝试这样的事情时:

    class Direction(Enum):
        NORTH = (1,0, Direction.EAST, Direction.WEST)
        SOUTH = (-1,0, Direction.WEST, Direction.EAST)
        EAST = (0,1, Direction.SOUTH, Direction.NORTH)
        WEST = (0, -1, Direction.NORTH, Direction.SOUTH)
        
        def __init__(self, y, x, r, l):
            self.y = y
            self.x = x
            self.r = r
            self.l = l

我收到一个看起来像这样的错误:

Traceback (most recent call last):
  File "lol.py", line 2, in <module>
    class Direction(Enum):
  File "lol.py", line 3, in Direction
    NORTH = (1,0, Direction.EAST, Direction.WEST)
NameError: name 'Direction' is not defined

在上面的示例中,将“方向”替换为“自我”时,我也会遇到同样的问题。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您不介意对Enum稍加重新排序,那就很容易了:

class Directions(Enum):
    #
    NORTH = 1, 0
    EAST = 0, 1
    SOUTH = -1, 0
    WEST = 0, -1
    #
    def __init__(self, x, y):
        self.x = x
        self.y = y
        if len(self.__class__):
            # make links
            all = list(self.__class__)
            left, right = all[0], all[-1]
            self.left = left
            self.right = right
            left.right = self
            right.left = self

并在使用中:

>>> Directions.NORTH
<Directions.NORTH: (1, 0)>

>>> Directions.NORTH.left
<Directions.EAST: (0, 1)>

>>> Directions.NORTH.right
<Directions.WEST: (0, -1)>

>>> Directions.WEST.left
<Directions.NORTH: (1, 0)>

>>> Directions.WEST.right
<Directions.SOUTH: (-1, 0)>

披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)库的作者。

答案 1 :(得分:0)

您可以使用@antont建议并使用字典,这是完全有效的。

另一种解决方案,与原始解决方案很接近:

from enum import Enum


class Direction(Enum):
    NORTH = 0
    SOUTH = 1
    EAST = 2
    WEST = 3

    @property
    def x(self):
        return 0 if self in [self.NORTH, self.SOUTH] else 1 if self == self.EAST else -1

    @property
    def y(self):
        return 0 if self in [self.EAST, self.WEST] else 1 if self == self.NORTH else -1

    def _turn(self, left=True):
        dirs = [self.NORTH, self.EAST, self.SOUTH, self.WEST]
        return dirs[(dirs.index(self) + (-1 if left else 1)) % 4]

    @property
    def left(self):
        return self._turn()

    @property
    def right(self):
        return self._turn(left=False)


direction = Direction.SOUTH
print(direction.y)
print(direction.left)

输出:

-1
Direction.EAST
相关问题