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