summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-08-21 09:33:14 (GMT)
committerGitHub <noreply@github.com>2021-08-21 09:33:14 (GMT)
commit5bd27c3be5734e158f67ff86087a977a25d89161 (patch)
treee40cee6a6eb8de4fad898f582263766c7ee4e43e
parent838b0e975fc2c106508eb27d19a9548533ac1e55 (diff)
downloadcpython-5bd27c3be5734e158f67ff86087a977a25d89161.zip
cpython-5bd27c3be5734e158f67ff86087a977a25d89161.tar.gz
cpython-5bd27c3be5734e158f67ff86087a977a25d89161.tar.bz2
bpo-44524: Do not set _name of _SpecialForm without need (GH-27861) (GH-27871)
Because setting non-empty _name affects behavior of other code. In most cases __name__ can be derived from __origin__.__name__. (cherry picked from commit 4ceec495598e78f0776dd46d511dcc612a434dc3) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r--Lib/test/test_typing.py1
-rw-r--r--Lib/typing.py19
2 files changed, 8 insertions, 12 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index af7c343..b1cd547 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -4873,7 +4873,6 @@ class SpecialAttrsTests(BaseTestCase):
self.assertEqual(cls.__name__, name, str(cls))
self.assertEqual(cls.__qualname__, name, str(cls))
self.assertEqual(cls.__module__, 'typing', str(cls))
- self.assertEqual(getattr(cls, '_name', name), name, str(cls))
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
s = pickle.dumps(cls, proto)
loaded = pickle.loads(s)
diff --git a/Lib/typing.py b/Lib/typing.py
index 6d7ba33..4935460 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -453,7 +453,7 @@ def ClassVar(self, parameters):
be used with isinstance() or issubclass().
"""
item = _type_check(parameters, f'{self} accepts only single type.')
- return _GenericAlias(self, (item,), name="ClassVar")
+ return _GenericAlias(self, (item,))
@_SpecialForm
def Final(self, parameters):
@@ -474,7 +474,7 @@ def Final(self, parameters):
There is no runtime checking of these properties.
"""
item = _type_check(parameters, f'{self} accepts only single type.')
- return _GenericAlias(self, (item,), name="Final")
+ return _GenericAlias(self, (item,))
@_SpecialForm
def Union(self, parameters):
@@ -512,12 +512,9 @@ def Union(self, parameters):
parameters = _remove_dups_flatten(parameters)
if len(parameters) == 1:
return parameters[0]
-
if len(parameters) == 2 and type(None) in parameters:
- name = "Optional"
- else:
- name = "Union"
- return _UnionGenericAlias(self, parameters, name=name)
+ return _UnionGenericAlias(self, parameters, name="Optional")
+ return _UnionGenericAlias(self, parameters)
@_SpecialForm
def Optional(self, parameters):
@@ -562,7 +559,7 @@ def Literal(self, parameters):
except TypeError: # unhashable parameters
pass
- return _LiteralGenericAlias(self, parameters, name="Literal")
+ return _LiteralGenericAlias(self, parameters)
@_SpecialForm
@@ -601,7 +598,7 @@ def Concatenate(self, parameters):
"ParamSpec variable.")
msg = "Concatenate[arg, ...]: each arg must be a type."
parameters = tuple(_type_check(p, msg) for p in parameters)
- return _ConcatenateGenericAlias(self, parameters, name="Concatenate")
+ return _ConcatenateGenericAlias(self, parameters)
@_SpecialForm
@@ -649,7 +646,7 @@ def TypeGuard(self, parameters):
PEP 647 (User-Defined Type Guards).
"""
item = _type_check(parameters, f'{self} accepts only single type.')
- return _GenericAlias(self, (item,), name="TypeGuard")
+ return _GenericAlias(self, (item,))
class ForwardRef(_Final, _root=True):
@@ -960,7 +957,7 @@ class _BaseGenericAlias(_Final, _root=True):
def __getattr__(self, attr):
if attr in {'__name__', '__qualname__'}:
- return self._name
+ return self._name or self.__origin__.__name__
# We are careful for copy and pickle.
# Also for simplicity we just don't relay all dunder names