我想在python中使用枚举,如下面的代码(java)。我是Python的新手。我在Java中有以下代码,并希望在Python中复制功能:
class Direction {
public enum Direction {LEFT, RIGHT, UP, DOWN}
public void navigate(Direction direction)
switch(direction){
case Direction.LEFT:
System.out.print("left");
break;
case Direction.RIGHT:
System.out.print("right");
break;
case Direction.UP:
System.out.print("up");
break;
case Direction.DOWN:
System.out.print("down");
break;
}
}
如何强制用户只为Python方法提供枚举?
答案 0 :(得分:10)
Python是动态的和鸭子类型 - 变量可以改变类型,你不能强制类型的方法。
但是,您可以使用isinstance()
检查方法正文中的类型。 instance()
将允许用户将enum
子类化,以便将来扩展。
E.g。
# Python 2.x: pip install enum34
from enum import Enum
class Direction(Enum):
LEFT = "left"
RIGHT = "right"
UP = "up"
DOWN = "down"
def move(direction):
# Type checking
if not isinstance(direction, Direction):
raise TypeError('direction must be an instance of Direction Enum')
print direction.value
>>> move(Direction.LEFT)
left
>>> move("right")
TypeError: direction must be an instance of Direction Enum
答案 1 :(得分:4)
“pythonic”要做的就是遵循 duck-typing 的原则:尝试接受你传递的价值而不要大惊小怪。在这种情况下,不是强制执行类型,而只是检查每个枚举值是否相等,并为无法处理的任何内容引发错误:
def navigate(direction):
"""Turn toward `direction` (an enum of type `Direction`)"""
if direction == Direction.left:
print("Left")
elif direction == Direction.right:
(etc., etc.)
else:
# Hmm, `direction` does not compare equal to any enum value:
raise ValueError("Invalid direction "+ str(direction))
答案 2 :(得分:2)
添加到alexis'回答,一个更好的方法可能是:
def navigate(direction):
""":params: <string> Direction to move to"""
assert direction.lower() in ["left", "right"], "Invalid direction "
print direction
如果使用&#34; left&#34;以外的方向字符串调用此函数。或者&#34;对&#34;,它会引发一个带有消息的AssertionError&#34;无效的方向&#34;。
干杯