我可以把Python Flag枚举分解成它的基本部分吗?



我有一个枚举,它代表了在迷宫中给定单元格允许移动的方向:

class Direction(Flag):
NORTH = 1
EAST = 2
SOUTH = 4
WEST = 8
NE = NORTH | EAST
NW = NORTH | WEST
...etc
NESW = NORTH | EAST | SOUTH | WEST

这使得检查你是否可以往西走很容易,你可以检查cell.directions & Direction.WEST。但是如果我想遍历可能的方向呢?比如for d in cell.directions: ...,但你不能这样做。如果我没有对所有可能的方向组合进行别名(这会使我的代码更简单),那么我可以这样做:

for d in Direction:
if cell.directions & d:
....

但这对我来说不起作用,因为它也会迭代所有组合方向,而不仅仅是四个基本的基本方向。这里有好的解决方案吗?

在Python 3.11中,这与您所期望的一样:迭代只提供规范(即2的幂)标志,其他所有标志都被视为别名。

即使在以前的版本中,也可以这样做:

from enum import Flag
class Direction(Flag):
NORTH = 1
EAST = 2
SOUTH = 4
WEST = 8
NORTH, EAST, SOUTH, WEST = Direction
directions = NORTH | EAST
d = NORTH
if d in directions:
print('going North!')

披露:我是Python stdlibEnum,enum34backport和高级枚举(aenum)库的作者。

您可以创建一个列表basic_directions = [NORTH, EAST, SOUTH, WEST],并使用您之前编写的相同的for循环:

for d in basic_directions:
if cell.directions & d:
....

最新更新