Skip to content

bpo-44732: Rename types.Union to types.UnionType #27342

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Doc/library/stdtypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5040,16 +5040,16 @@ enables cleaner type hinting syntax compared to :data:`typing.Union`.
TypeError: isinstance() argument 2 cannot contain a parameterized generic

The user-exposed type for the union object can be accessed from
:data:`types.Union` and used for :func:`isinstance` checks. An object cannot be
:data:`types.UnionType` and used for :func:`isinstance` checks. An object cannot be
instantiated from the type::

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

.. note::
The :meth:`__or__` method for type objects was added to support the syntax
Expand Down
2 changes: 1 addition & 1 deletion Doc/library/types.rst
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ Standard names are defined for the following types:
This type can now be subclassed.


.. data:: Union
.. data:: UnionType

The type of :ref:`union type expressions<types-union>`.

Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3090,7 +3090,7 @@ class C(Generic[T]): pass
self.assertIs(get_origin(Callable), collections.abc.Callable)
self.assertIs(get_origin(list[int]), list)
self.assertIs(get_origin(list), None)
self.assertIs(get_origin(list | str), types.Union)
self.assertIs(get_origin(list | str), types.UnionType)
self.assertIs(get_origin(P.args), P)
self.assertIs(get_origin(P.kwargs), P)

Expand Down
3 changes: 1 addition & 2 deletions Lib/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,9 +297,8 @@ def wrapped(*args, **kwargs):

return wrapped


GenericAlias = type(list[int])
Union = type(int | str)
UnionType = type(int | str)

EllipsisType = type(Ellipsis)
NoneType = type(None)
Expand Down
22 changes: 11 additions & 11 deletions Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def _type_check(arg, msg, is_argument=True, module=None):
return arg
if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
raise TypeError(f"Plain {arg} is not valid as type argument")
if isinstance(arg, (type, TypeVar, ForwardRef, types.Union, ParamSpec)):
if isinstance(arg, (type, TypeVar, ForwardRef, types.UnionType, ParamSpec)):
return arg
if not callable(arg):
raise TypeError(f"{msg} Got {arg!r:.100}.")
Expand Down Expand Up @@ -215,7 +215,7 @@ def _collect_type_vars(types_, typevar_types=None):
for t in types_:
if isinstance(t, typevar_types) and t not in tvars:
tvars.append(t)
if isinstance(t, (_GenericAlias, GenericAlias, types.Union)):
if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
tvars.extend([t for t in t.__parameters__ if t not in tvars])
return tuple(tvars)

Expand Down Expand Up @@ -268,7 +268,7 @@ def _remove_dups_flatten(parameters):
# Flatten out Union[Union[...], ...].
params = []
for p in parameters:
if isinstance(p, (_UnionGenericAlias, types.Union)):
if isinstance(p, (_UnionGenericAlias, types.UnionType)):
params.extend(p.__args__)
elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
params.extend(p[1:])
Expand Down Expand Up @@ -322,13 +322,13 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
"""
if isinstance(t, ForwardRef):
return t._evaluate(globalns, localns, recursive_guard)
if isinstance(t, (_GenericAlias, GenericAlias, types.Union)):
if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
if ev_args == t.__args__:
return t
if isinstance(t, GenericAlias):
return GenericAlias(t.__origin__, ev_args)
if isinstance(t, types.Union):
if isinstance(t, types.UnionType):
return functools.reduce(operator.or_, ev_args)
else:
return t.copy_with(ev_args)
Expand Down Expand Up @@ -1038,7 +1038,7 @@ def __getitem__(self, params):
for arg in self.__args__:
if isinstance(arg, self._typevar_types):
arg = subst[arg]
elif isinstance(arg, (_GenericAlias, GenericAlias, types.Union)):
elif isinstance(arg, (_GenericAlias, GenericAlias, types.UnionType)):
subparams = arg.__parameters__
if subparams:
subargs = tuple(subst[x] for x in subparams)
Expand Down Expand Up @@ -1206,7 +1206,7 @@ def copy_with(self, params):
return Union[params]

def __eq__(self, other):
if not isinstance(other, (_UnionGenericAlias, types.Union)):
if not isinstance(other, (_UnionGenericAlias, types.UnionType)):
return NotImplemented
return set(self.__args__) == set(other.__args__)

Expand Down Expand Up @@ -1810,7 +1810,7 @@ def _strip_annotations(t):
if stripped_args == t.__args__:
return t
return GenericAlias(t.__origin__, stripped_args)
if isinstance(t, types.Union):
if isinstance(t, types.UnionType):
stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
if stripped_args == t.__args__:
return t
Expand Down Expand Up @@ -1841,8 +1841,8 @@ def get_origin(tp):
return tp.__origin__
if tp is Generic:
return Generic
if isinstance(tp, types.Union):
return types.Union
if isinstance(tp, types.UnionType):
return types.UnionType
return None


Expand All @@ -1866,7 +1866,7 @@ def get_args(tp):
or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
res = (list(res[:-1]), res[-1])
return res
if isinstance(tp, types.Union):
if isinstance(tp, types.UnionType):
return tp.__args__
return ()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Rename ``types.Union`` to ``types.UnionType``.
6 changes: 3 additions & 3 deletions Objects/unionobject.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// types.Union -- used to represent e.g. Union[int, str], int | str
// types.UnionType -- used to represent e.g. Union[int, str], int | str
#include "Python.h"
#include "pycore_object.h" // _PyObject_GC_TRACK/UNTRACK
#include "pycore_unionobject.h"
Expand Down Expand Up @@ -414,7 +414,7 @@ union_parameters(PyObject *self, void *Py_UNUSED(unused))
}

static PyGetSetDef union_properties[] = {
{"__parameters__", union_parameters, (setter)NULL, "Type variables in the types.Union.", NULL},
{"__parameters__", union_parameters, (setter)NULL, "Type variables in the types.UnionType.", NULL},
{0}
};

Expand All @@ -424,7 +424,7 @@ static PyNumberMethods union_as_number = {

PyTypeObject _PyUnion_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_name = "types.Union",
.tp_name = "types.UnionType",
.tp_doc = "Represent a PEP 604 union type\n"
"\n"
"E.g. for int | str",
Expand Down