| 
									
										
										
										
											2017-02-13 22:50:14 +01:00
										 |  |  | """Module for testing the behavior of generics across different modules.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 14:33:00 -04:00
										 |  |  | import sys | 
					
						
							|  |  |  | from textwrap import dedent | 
					
						
							|  |  |  | from typing import TypeVar, Generic, Optional | 
					
						
							| 
									
										
										
										
											2017-02-13 22:50:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 14:33:00 -04:00
										 |  |  | if sys.version_info[:2] >= (3, 6): | 
					
						
							|  |  |  |     exec(dedent("""
 | 
					
						
							|  |  |  |     default_a: Optional['A'] = None | 
					
						
							|  |  |  |     default_b: Optional['B'] = None | 
					
						
							| 
									
										
										
										
											2017-02-13 22:50:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 14:33:00 -04:00
										 |  |  |     T = TypeVar('T') | 
					
						
							| 
									
										
										
										
											2017-02-13 22:50:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class A(Generic[T]): | 
					
						
							| 
									
										
										
										
											2017-09-14 14:33:00 -04:00
										 |  |  |         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__ | 
					
						
							|  |  |  |         ) |