diff options
author | Ćukasz Langa <lukasz@langa.pl> | 2017-09-14 18:33:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-14 18:33:00 (GMT) |
commit | f350a268a7071ce7d7a5bb86a9b1229782d4963b (patch) | |
tree | 04b38394dea9be76bea00f41b488c3e3a223dd34 /Lib/test/mod_generics_cache.py | |
parent | d393c1b227f22fb9af66040b2b367c99a4d1fa9a (diff) | |
download | cpython-f350a268a7071ce7d7a5bb86a9b1229782d4963b.zip cpython-f350a268a7071ce7d7a5bb86a9b1229782d4963b.tar.gz cpython-f350a268a7071ce7d7a5bb86a9b1229782d4963b.tar.bz2 |
bpo-28556: typing.get_type_hints: better globalns for classes and modules (#3582)
This makes the default behavior (without specifying `globalns` manually) more
predictable for users, finds the right globalns automatically.
Implementation for classes assumes has a `__module__` attribute and that module
is present in `sys.modules`. It does this recursively for all bases in the
MRO. For modules, the implementation just uses their `__dict__` directly.
This is backwards compatible, will just raise fewer exceptions in naive user
code.
Originally implemented and reviewed at https://github.com/python/typing/pull/470.
Diffstat (limited to 'Lib/test/mod_generics_cache.py')
-rw-r--r-- | Lib/test/mod_generics_cache.py | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/Lib/test/mod_generics_cache.py b/Lib/test/mod_generics_cache.py index d9a60b4..6d35c58 100644 --- a/Lib/test/mod_generics_cache.py +++ b/Lib/test/mod_generics_cache.py @@ -1,14 +1,53 @@ """Module for testing the behavior of generics across different modules.""" -from typing import TypeVar, Generic +import sys +from textwrap import dedent +from typing import TypeVar, Generic, Optional -T = TypeVar('T') +if sys.version_info[:2] >= (3, 6): + exec(dedent(""" + default_a: Optional['A'] = None + default_b: Optional['B'] = None -class A(Generic[T]): - pass + T = TypeVar('T') -class B(Generic[T]): class A(Generic[T]): - pass + some_b: 'B' + + + class B(Generic[T]): + class A(Generic[T]): + pass + + my_inner_a1: 'B.A' + my_inner_a2: A + my_outer_a: 'A' # unless somebody calls get_type_hints with localns=B.__dict__ + """)) +else: # This should stay in sync with the syntax above. + __annotations__ = dict( + default_a=Optional['A'], + default_b=Optional['B'], + ) + default_a = None + default_b = None + + T = TypeVar('T') + + + class A(Generic[T]): + __annotations__ = dict( + some_b='B' + ) + + + class B(Generic[T]): + class A(Generic[T]): + pass + + __annotations__ = dict( + my_inner_a1='B.A', + my_inner_a2=A, + my_outer_a='A' # unless somebody calls get_type_hints with localns=B.__dict__ + ) |