Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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