Union type; Union[X, Y] means either X or Y.

To define a union, use e.g. Union[int, str]. Details:

  • The arguments must be types and there must be at least one.

  • None as an argument is a special case and is replaced by type(None).

  • Unions of unions are flattened, e.g.::

    Union[Union[int, str], float] == Union[int, str, float]

  • Unions of a single argument vanish, e.g.::

    Union[int] == int # The constructor actually returns int

  • Redundant arguments are skipped, e.g.::

    Union[int, str, int] == Union[int, str]

  • When comparing unions, the argument order is ignored, e.g.::

    Union[int, str] == Union[str, int]

  • When two arguments have a subclass relationship, the least derived argument is kept, e.g.::

    class Employee: pass class Manager(Employee): pass Union[int, Employee, Manager] == Union[int, Employee] Union[Manager, int, Employee] == Union[int, Employee] Union[Employee, Manager] == Employee

  • Similar for object::

    Union[int, object] == object

  • You cannot subclass or instantiate a union.

  • You can use Optional[X] as a shorthand for Union[X, None].