Search code examples
pythonpython-2.7enums

Enums in Python: How to enforce in method arguments


I want to use enums in python like in code below (java). I am a greenhorn in Python. I have the following code in Java and want to replicate the functionality in 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;
  }
}

How can I enforce users to only provide an enum to a Python method?


Solution

  • Python is dynamic and duck typed - variables can change type and you can't force types on methods.

    You can, however, check for types in the body of a method using isinstance().

    isinstance() will allow users to subclass your enum for future extensibility. - See comments

    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