Skip to content

Commit

Permalink
bpo-32873: Remove a name hack for generic aliases in typing module (G…
Browse files Browse the repository at this point in the history
…H-6376)

This removes a hack and replaces it with a proper
mapping {'list': 'List', 'dict': 'Dict', ...}.
  • Loading branch information
ilevkivskyi committed Apr 5, 2018
1 parent ee566fe commit 2a363d2
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
5 changes: 3 additions & 2 deletions Lib/test/test_typing.py
Expand Up @@ -1058,14 +1058,15 @@ class C(B[int]):
self.assertEqual(x.bar, 'abc')
self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
samples = [Any, Union, Tuple, Callable, ClassVar,
Union[int, str], ClassVar[List], Tuple[int, ...], Callable[[str], bytes]]
Union[int, str], ClassVar[List], Tuple[int, ...], Callable[[str], bytes],
typing.DefaultDict, typing.FrozenSet[int]]
for s in samples:
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
z = pickle.dumps(s, proto)
x = pickle.loads(z)
self.assertEqual(s, x)
more_samples = [List, typing.Iterable, typing.Type, List[int],
typing.Type[typing.Mapping]]
typing.Type[typing.Mapping], typing.AbstractSet[Tuple[int, str]]]
for s in more_samples:
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
z = pickle.dumps(s, proto)
Expand Down
15 changes: 14 additions & 1 deletion Lib/typing.py
Expand Up @@ -611,6 +611,19 @@ def __reduce__(self):
# * __args__ is a tuple of all arguments used in subscripting,
# e.g., Dict[T, int].__args__ == (T, int).


# Mapping from non-generic type names that have a generic alias in typing
# but with a different name.
_normalize_alias = {'list': 'List',
'tuple': 'Tuple',
'dict': 'Dict',
'set': 'Set',
'frozenset': 'FrozenSet',
'deque': 'Deque',
'defaultdict': 'DefaultDict',
'type': 'Type',
'Set': 'AbstractSet'}

def _is_dunder(attr):
return attr.startswith('__') and attr.endswith('__')

Expand All @@ -629,7 +642,7 @@ def __init__(self, origin, params, *, inst=True, special=False, name=None):
self._special = special
if special and name is None:
orig_name = origin.__name__
name = orig_name[0].title() + orig_name[1:]
name = _normalize_alias.get(orig_name, orig_name)
self._name = name
if not isinstance(params, tuple):
params = (params,)
Expand Down

0 comments on commit 2a363d2

Please sign in to comment.