Python中的枚举:如何在方法参数中强制执行

时间:2016-02-15 10:54:22

标签: python python-2.7 enums

我想在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方法提供枚举?

3 个答案:

答案 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;。

干杯