【问题标题】:Enums in Python: How to enforce in method argumentsPython 中的枚举:如何在方法参数中强制执行
【发布时间】:2026-01-20 23:45:01
【问题描述】:

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

【问题讨论】:

  • 我看到了那个,但它没有解释(至少对我来说),如何将枚举元素作为参数传递并强制用户使用枚举元素而不是输入原始字符串或不同的值。
  • 我已将问题更新为您问题的主旨。理想情况下,您会提供 Python 代码,以便我们可以看到您想要实现的目标

标签: python python-2.7 enums


【解决方案1】:

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

但是,您可以使用isinstance() 检查方法主体中的类型。

isinstance() 将允许用户为您的enum 子类化以供将来扩展。 - 参见 cmets

例如

# 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

【讨论】:

  • 其实Enums的成员是不能被子类化的。
  • @EthanFurman 哇哦。我刚刚测试了扩展枚举。果然,你不能 - 感谢您的提醒! ?
【解决方案2】:

“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))

【讨论】:

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