aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/functools.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/functools.py')
-rw-r--r--Lib/functools.py17
1 files changed, 5 insertions, 12 deletions
diff --git a/Lib/functools.py b/Lib/functools.py
index 70c59b109d9..5e2579f6d8e 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -926,16 +926,11 @@ def singledispatch(func):
dispatch_cache[cls] = impl
return impl
- def _is_union_type(cls):
- from typing import get_origin, Union
- return get_origin(cls) in {Union, UnionType}
-
def _is_valid_dispatch_type(cls):
if isinstance(cls, type):
return True
- from typing import get_args
- return (_is_union_type(cls) and
- all(isinstance(arg, type) for arg in get_args(cls)))
+ return (isinstance(cls, UnionType) and
+ all(isinstance(arg, type) for arg in cls.__args__))
def register(cls, func=None):
"""generic_func.register(cls, func) -> func
@@ -967,7 +962,7 @@ def singledispatch(func):
from annotationlib import Format, ForwardRef
argname, cls = next(iter(get_type_hints(func, format=Format.FORWARDREF).items()))
if not _is_valid_dispatch_type(cls):
- if _is_union_type(cls):
+ if isinstance(cls, UnionType):
raise TypeError(
f"Invalid annotation for {argname!r}. "
f"{cls!r} not all arguments are classes."
@@ -983,10 +978,8 @@ def singledispatch(func):
f"{cls!r} is not a class."
)
- if _is_union_type(cls):
- from typing import get_args
-
- for arg in get_args(cls):
+ if isinstance(cls, UnionType):
+ for arg in cls.__args__:
registry[arg] = func
else:
registry[cls] = func