mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 f350a268a7
			
		
	
	
		f350a268a7
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Module for testing the behavior of generics across different modules."""
 | |
| 
 | |
| import sys
 | |
| from textwrap import dedent
 | |
| from typing import TypeVar, Generic, Optional
 | |
| 
 | |
| 
 | |
| if sys.version_info[:2] >= (3, 6):
 | |
|     exec(dedent("""
 | |
|     default_a: Optional['A'] = None
 | |
|     default_b: Optional['B'] = None
 | |
| 
 | |
|     T = TypeVar('T')
 | |
| 
 | |
| 
 | |
|     class A(Generic[T]):
 | |
|         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__
 | |
|         )
 |