อ้างถึง enum อื่นเป็นค่า enum ใน Python? [ซ้ำ]

Sep 18 2020

สมมติว่าฉันมีPython Enumแต่ละอินสแตนซ์ของ Enum ควรอ้างอิงอินสแตนซ์อื่นของ 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

ฉันได้รับปัญหาเดียวกันเมื่อฉันแทนที่ "Direction" ด้วย "self" ในตัวอย่างด้านบน

มีวิธีทำไหม?

คำตอบ

1 EthanFurman Sep 22 2020 at 05:24

หากคุณไม่สนใจที่จะจัดเรียง 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 stdlibEnum , enum34backportและไลบรารีAdvanced Enumeration ( aenum)

Grismar Sep 18 2020 at 13:28

คุณสามารถใช้คำแนะนำของ @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