อ้างถึง 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