summaryrefslogtreecommitdiffstats
path: root/Lib/test/mod_generics_cache.py
diff options
context:
space:
mode:
authorƁukasz Langa <lukasz@langa.pl>2017-09-14 18:33:00 (GMT)
committerGitHub <noreply@github.com>2017-09-14 18:33:00 (GMT)
commitf350a268a7071ce7d7a5bb86a9b1229782d4963b (patch)
tree04b38394dea9be76bea00f41b488c3e3a223dd34 /Lib/test/mod_generics_cache.py
parentd393c1b227f22fb9af66040b2b367c99a4d1fa9a (diff)
downloadcpython-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.py51
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__
+ )