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

use*_*074 10 python enums python-2.7

我想在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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何强制用户只提供Python方法的枚举?

Ala*_*ack 12

Python是动态的和鸭子类型 - 变量可以改变类型,你不能强制类型的方法.

但是,您可以使用方法检查方法体中的类型isinstance().isinstance()将允许用户子类化您enum的未来可扩展性.

例如

# 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
Run Code Online (Sandbox Code Playgroud)

  • 实际上,带有成员的“Enum”不能被子类化。 (2认同)

ale*_*xis 5

“ pythonic”要做的就是遵循鸭子输入的原则:尝试接受传递给您的值,而不必大惊小怪。在这种情况下,我不用强制类型,而只是检查每个枚举值的相等性,并对任何无法处理的错误引发错误:

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))
Run Code Online (Sandbox Code Playgroud)

  • 我得到了这个,现在我非常感谢所有具有对象类型的语言的编码之神。不过还是谢谢大家的帮助。 (3认同)