Skip to content

Commit 1d77917

Browse files
committed
Initial attempt for typing fix
1 parent 246577d commit 1d77917

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

Lib/test/test_typing.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ def test_empty(self):
349349
def test_no_eval_union(self):
350350
u = Union[int, str]
351351
def f(x: u): ...
352-
self.assertIs(get_type_hints(f)['x'], u)
352+
self.assertIs(get_type_hints(f, globals(), locals())['x'], u)
353353

354354
def test_function_repr_union(self):
355355
def fun() -> int: ...
@@ -2853,7 +2853,7 @@ def test_get_type_hints_classes(self):
28532853
{'x': int, 'y': int})
28542854
self.assertEqual(gth(mod_generics_cache.B),
28552855
{'my_inner_a1': mod_generics_cache.B.A,
2856-
'my_inner_a2': mod_generics_cache.B.A,
2856+
'my_inner_a2': mod_generics_cache.A,
28572857
'my_outer_a': mod_generics_cache.A})
28582858

28592859
def test_respect_no_type_check(self):
@@ -3641,7 +3641,7 @@ def test_annotation_usage(self):
36413641
self.assertEqual(tim.cool, 9000)
36423642
self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
36433643
self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
3644-
self.assertEqual(CoolEmployee.__annotations__,
3644+
self.assertEqual(gth(CoolEmployee),
36453645
collections.OrderedDict(name=str, cool=int))
36463646

36473647
def test_annotation_usage_with_default(self):
@@ -3655,7 +3655,7 @@ def test_annotation_usage_with_default(self):
36553655

36563656
self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault')
36573657
self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool'))
3658-
self.assertEqual(CoolEmployeeWithDefault.__annotations__,
3658+
self.assertEqual(gth(CoolEmployeeWithDefault),
36593659
dict(name=str, cool=int))
36603660
self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0))
36613661

@@ -3823,7 +3823,7 @@ def test_typeddict_errors(self):
38233823
def test_py36_class_syntax_usage(self):
38243824
self.assertEqual(LabelPoint2D.__name__, 'LabelPoint2D')
38253825
self.assertEqual(LabelPoint2D.__module__, __name__)
3826-
self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str})
3826+
self.assertEqual(gth(LabelPoint2D), {'x': int, 'y': int, 'label': str})
38273827
self.assertEqual(LabelPoint2D.__bases__, (dict,))
38283828
self.assertEqual(LabelPoint2D.__total__, True)
38293829
self.assertNotIsSubclass(LabelPoint2D, typing.Sequence)
@@ -3882,19 +3882,19 @@ class Cat(Animal):
38823882

38833883
assert BaseAnimal.__required_keys__ == frozenset(['name'])
38843884
assert BaseAnimal.__optional_keys__ == frozenset([])
3885-
assert BaseAnimal.__annotations__ == {'name': str}
3885+
assert gth(BaseAnimal) == {'name': str}
38863886

38873887
assert Animal.__required_keys__ == frozenset(['name'])
38883888
assert Animal.__optional_keys__ == frozenset(['tail', 'voice'])
3889-
assert Animal.__annotations__ == {
3889+
assert gth(Animal) == {
38903890
'name': str,
38913891
'tail': bool,
38923892
'voice': str,
38933893
}
38943894

38953895
assert Cat.__required_keys__ == frozenset(['name', 'fur_color'])
38963896
assert Cat.__optional_keys__ == frozenset(['tail', 'voice'])
3897-
assert Cat.__annotations__ == {
3897+
assert gth(Cat) == {
38983898
'fur_color': str,
38993899
'name': str,
39003900
'tail': bool,
@@ -3915,23 +3915,23 @@ def test_io(self):
39153915
def stuff(a: IO) -> AnyStr:
39163916
return a.readline()
39173917

3918-
a = stuff.__annotations__['a']
3918+
a = gth(stuff)['a']
39193919
self.assertEqual(a.__parameters__, (AnyStr,))
39203920

39213921
def test_textio(self):
39223922

39233923
def stuff(a: TextIO) -> str:
39243924
return a.readline()
39253925

3926-
a = stuff.__annotations__['a']
3926+
a = gth(stuff)['a']
39273927
self.assertEqual(a.__parameters__, ())
39283928

39293929
def test_binaryio(self):
39303930

39313931
def stuff(a: BinaryIO) -> bytes:
39323932
return a.readline()
39333933

3934-
a = stuff.__annotations__['a']
3934+
a = gth(stuff)['a']
39353935
self.assertEqual(a.__parameters__, ())
39363936

39373937
def test_io_submodule(self):

Lib/typing.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,11 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
13661366
locals, respectively.
13671367
"""
13681368

1369+
def resolve(value, globalns, localns=localns):
1370+
# double resolve forward refs
1371+
value = _eval_type(value, globalns, localns)
1372+
return _eval_type(value, globalns, localns)
1373+
13691374
if getattr(obj, '__no_type_check__', None):
13701375
return {}
13711376
# Classes require a special treatment.
@@ -1382,7 +1387,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
13821387
value = type(None)
13831388
if isinstance(value, str):
13841389
value = ForwardRef(value, is_argument=False)
1385-
value = _eval_type(value, base_globals, localns)
1390+
value = resolve(value, base_globals)
13861391
hints[name] = value
13871392
return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
13881393

@@ -1414,7 +1419,7 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
14141419
value = type(None)
14151420
if isinstance(value, str):
14161421
value = ForwardRef(value)
1417-
value = _eval_type(value, globalns, localns)
1422+
value = resolve(value, globalns)
14181423
if name in defaults and defaults[name] is None:
14191424
value = Optional[value]
14201425
hints[name] = value

0 commit comments

Comments
 (0)