Объект объединения 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