https://github.com/python/cpython/commit/7473c600a5890ffd87e8761c418bf3312ce7f38c commit: 7473c600a5890ffd87e8761c418bf3312ce7f38c branch: main author: Jelle Zijlstra <jelle.zijls...@gmail.com> committer: JelleZijlstra <jelle.zijls...@gmail.com> date: 2025-04-04T11:15:31-07:00 summary:
gh-131933: Document UnionType/Union merger in What's New (#131941) Co-authored-by: Alex Waygood Co-authored-by: Bénédikt Tran <10796600+picn...@users.noreply.github.com> files: M Doc/whatsnew/3.14.rst diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index c475d33472a318..d97874fe7a88d4 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1075,6 +1075,54 @@ turtle (Contributed by Marie Roald and Yngve Mardal Moe in :gh:`126350`.) +types +----- + +* :class:`types.UnionType` is now an alias for :class:`typing.Union`. + See :ref:`below <whatsnew314-typing-union>` for more details. + (Contributed by Jelle Zijlstra in :gh:`105499`.) + + +typing +------ + +.. _whatsnew314-typing-union: + +* :class:`types.UnionType` and :class:`typing.Union` are now aliases for each other, + meaning that both old-style unions (created with ``Union[int, str]``) and new-style + unions (``int | str``) now create instances of the same runtime type. This unifies + the behavior between the two syntaxes, but leads to some differences in behavior that + may affect users who introspect types at runtime: + + - Both syntaxes for creating a union now produce the same string representation in + ``repr()``. For example, ``repr(Union[int, str])`` + is now ``"int | str"`` instead of ``"typing.Union[int, str]"``. + - Unions created using the old syntax are no longer cached. Previously, running + ``Union[int, str]`` multiple times would return the same object + (``Union[int, str] is Union[int, str]`` would be ``True``), but now it will + return two different objects. Users should use ``==`` to compare unions for equality, not + ``is``. New-style unions have never been cached this way. + This change could increase memory usage for some programs that use a large number of + unions created by subscripting ``typing.Union``. However, several factors offset this cost: + unions used in annotations are no longer evaluated by default in Python 3.14 + because of :pep:`649`; an instance of :class:`types.UnionType` is + itself much smaller than the object returned by ``Union[]`` was on prior Python + versions; and removing the cache also saves some space. It is therefore + unlikely that this change will cause a significant increase in memory usage for most + users. + - Previously, old-style unions were implemented using the private class + ``typing._UnionGenericAlias``. This class is no longer needed for the implementation, + but it has been retained for backward compatibility, with removal scheduled for Python + 3.17. Users should use documented introspection helpers like :func:`typing.get_origin` + and :func:`typing.get_args` instead of relying on private implementation details. + - It is now possible to use :class:`typing.Union` itself in :func:`isinstance` checks. + For example, ``isinstance(int | str, typing.Union)`` will return ``True``; previously + this raised :exc:`TypeError`. + - The ``__args__`` attribute of :class:`typing.Union` objects is no longer writable. + + (Contributed by Jelle Zijlstra in :gh:`105499`.) + + unicodedata ----------- @@ -1608,6 +1656,11 @@ Changes in the Python API This temporary change affects other threads. (Contributed by Serhiy Storchaka in :gh:`69998`.) +* :class:`types.UnionType` is now an alias for :class:`typing.Union`, + causing changes in some behaviors. + See :ref:`above <whatsnew314-typing-union>` for more details. + (Contributed by Jelle Zijlstra in :gh:`105499`.) + Build changes ============= _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com