Сообщить об ошибке.

Объект объединения Union в Python

Объект объединения Union (добавлен в Python 3.10) содержит значение операции | (побитовая или) над объектами нескольких типов. Этот тип в первую очередь предназначен для аннотаций типов. Выражение типа Union обеспечивает более чистый синтаксис подсказки типа по сравнению с typing.Union.

Синтаксис:

# добавлено в Python 3.10
X | Y | ...

Описание:

Синтаксис X | Y | ... определяет объект объединения, который содержит типы X, Y и т. д. Выражение Х | Y означает либо X, либо Y. Это эквивалентно typing.Union[X, Y]. Например, следующая функция ожидает аргумент типа int или float:

def square(number: int | float) -> int | float:
    return number ** 2

Синтаксис Union поддерживается в функциях isinstance() и issubclass():

>>> isinstance("", int | str)
# True

Однако нельзя использовать объекты объединения, содержащие параметризованные дженерики:

>>> isinstance(1, int | list[int])
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: isinstance() argument 2 cannot contain a parameterized generic

Доступ к предоставляемому пользователем типу для объекта объединения можно получить из types.UnionType и использовать для проверок isinstance(). Объект не может быть создан из типа:

>>> import types
>>> isinstance(int | str, types.UnionType)
# True
>>> types.UnionType()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot create 'types.UnionType' instances

Проверка равенства с другими объектами Union.

Объекты объединения Union можно проверить на равенство с другими объектами объединения. Подробности:

  • Объекты Union в скобках раскрываются:

    (int | str) | float == int | str | float
    
  • Избыточные типы удаляются:

    int | str | int == int | str
    
  • При сравнении Union порядок игнорируется:

    int | str == str | int
    
  • Он совместим с typing.Union:

    int | str == typing.Union[int, str]
    
  • Необязательные типы могут быть записаны как союз с None:

    str | None == typing.Optional[str]
    

Примечание. Для поддержки синтаксиса X | Y, для типовых объектов был добавлен метод __or__(). Если метакласс реализует __or__(), то Union может переопределить его:

class M(type):
    def __or__(self, other):
        return "Hello"

class C(metaclass=M):
    pass

>>> C | int
# 'Hello'
>>> int | C
# int | __main__.C