@@ -4791,66 +4791,185 @@ def test_no_isinstance(self):
47914791 issubclass (int , TypeGuard )
47924792
47934793
4794+ SpecialAttrsP = typing .ParamSpec ('SpecialAttrsP' )
4795+ SpecialAttrsT = typing .TypeVar ('SpecialAttrsT' , int , float , complex )
4796+
4797+
47944798class SpecialAttrsTests (BaseTestCase ):
4799+
47954800 def test_special_attrs (self ):
4796- cls_to_check = (
4801+ cls_to_check = {
47974802 # ABC classes
4798- typing .AbstractSet ,
4799- typing .AsyncContextManager ,
4800- typing .AsyncGenerator ,
4801- typing .AsyncIterable ,
4802- typing .AsyncIterator ,
4803- typing .Awaitable ,
4804- typing .ByteString ,
4805- typing .Callable ,
4806- typing .ChainMap ,
4807- typing .Collection ,
4808- typing .Container ,
4809- typing .ContextManager ,
4810- typing .Coroutine ,
4811- typing .Counter ,
4812- typing .DefaultDict ,
4813- typing .Deque ,
4814- typing .Dict ,
4815- typing .FrozenSet ,
4816- typing .Generator ,
4817- typing .Hashable ,
4818- typing .ItemsView ,
4819- typing .Iterable ,
4820- typing .Iterator ,
4821- typing .KeysView ,
4822- typing .List ,
4823- typing .Mapping ,
4824- typing .MappingView ,
4825- typing .MutableMapping ,
4826- typing .MutableSequence ,
4827- typing .MutableSet ,
4828- typing .OrderedDict ,
4829- typing .Reversible ,
4830- typing .Sequence ,
4831- typing .Set ,
4832- typing .Sized ,
4833- typing .Tuple ,
4834- typing .Type ,
4835- typing .ValuesView ,
4803+ typing .AbstractSet : 'AbstractSet' ,
4804+ typing .AsyncContextManager : 'AsyncContextManager' ,
4805+ typing .AsyncGenerator : 'AsyncGenerator' ,
4806+ typing .AsyncIterable : 'AsyncIterable' ,
4807+ typing .AsyncIterator : 'AsyncIterator' ,
4808+ typing .Awaitable : 'Awaitable' ,
4809+ typing .ByteString : 'ByteString' ,
4810+ typing .Callable : 'Callable' ,
4811+ typing .ChainMap : 'ChainMap' ,
4812+ typing .Collection : 'Collection' ,
4813+ typing .Container : 'Container' ,
4814+ typing .ContextManager : 'ContextManager' ,
4815+ typing .Coroutine : 'Coroutine' ,
4816+ typing .Counter : 'Counter' ,
4817+ typing .DefaultDict : 'DefaultDict' ,
4818+ typing .Deque : 'Deque' ,
4819+ typing .Dict : 'Dict' ,
4820+ typing .FrozenSet : 'FrozenSet' ,
4821+ typing .Generator : 'Generator' ,
4822+ typing .Hashable : 'Hashable' ,
4823+ typing .ItemsView : 'ItemsView' ,
4824+ typing .Iterable : 'Iterable' ,
4825+ typing .Iterator : 'Iterator' ,
4826+ typing .KeysView : 'KeysView' ,
4827+ typing .List : 'List' ,
4828+ typing .Mapping : 'Mapping' ,
4829+ typing .MappingView : 'MappingView' ,
4830+ typing .MutableMapping : 'MutableMapping' ,
4831+ typing .MutableSequence : 'MutableSequence' ,
4832+ typing .MutableSet : 'MutableSet' ,
4833+ typing .OrderedDict : 'OrderedDict' ,
4834+ typing .Reversible : 'Reversible' ,
4835+ typing .Sequence : 'Sequence' ,
4836+ typing .Set : 'Set' ,
4837+ typing .Sized : 'Sized' ,
4838+ typing .Tuple : 'Tuple' ,
4839+ typing .Type : 'Type' ,
4840+ typing .ValuesView : 'ValuesView' ,
4841+ # Subscribed ABC classes
4842+ typing .AbstractSet [Any ]: 'AbstractSet' ,
4843+ typing .AsyncContextManager [Any ]: 'AsyncContextManager' ,
4844+ typing .AsyncGenerator [Any , Any ]: 'AsyncGenerator' ,
4845+ typing .AsyncIterable [Any ]: 'AsyncIterable' ,
4846+ typing .AsyncIterator [Any ]: 'AsyncIterator' ,
4847+ typing .Awaitable [Any ]: 'Awaitable' ,
4848+ typing .Callable [[], Any ]: 'Callable' ,
4849+ typing .Callable [..., Any ]: 'Callable' ,
4850+ typing .ChainMap [Any , Any ]: 'ChainMap' ,
4851+ typing .Collection [Any ]: 'Collection' ,
4852+ typing .Container [Any ]: 'Container' ,
4853+ typing .ContextManager [Any ]: 'ContextManager' ,
4854+ typing .Coroutine [Any , Any , Any ]: 'Coroutine' ,
4855+ typing .Counter [Any ]: 'Counter' ,
4856+ typing .DefaultDict [Any , Any ]: 'DefaultDict' ,
4857+ typing .Deque [Any ]: 'Deque' ,
4858+ typing .Dict [Any , Any ]: 'Dict' ,
4859+ typing .FrozenSet [Any ]: 'FrozenSet' ,
4860+ typing .Generator [Any , Any , Any ]: 'Generator' ,
4861+ typing .ItemsView [Any , Any ]: 'ItemsView' ,
4862+ typing .Iterable [Any ]: 'Iterable' ,
4863+ typing .Iterator [Any ]: 'Iterator' ,
4864+ typing .KeysView [Any ]: 'KeysView' ,
4865+ typing .List [Any ]: 'List' ,
4866+ typing .Mapping [Any , Any ]: 'Mapping' ,
4867+ typing .MappingView [Any ]: 'MappingView' ,
4868+ typing .MutableMapping [Any , Any ]: 'MutableMapping' ,
4869+ typing .MutableSequence [Any ]: 'MutableSequence' ,
4870+ typing .MutableSet [Any ]: 'MutableSet' ,
4871+ typing .OrderedDict [Any , Any ]: 'OrderedDict' ,
4872+ typing .Reversible [Any ]: 'Reversible' ,
4873+ typing .Sequence [Any ]: 'Sequence' ,
4874+ typing .Set [Any ]: 'Set' ,
4875+ typing .Tuple [Any ]: 'Tuple' ,
4876+ typing .Tuple [Any , ...]: 'Tuple' ,
4877+ typing .Type [Any ]: 'Type' ,
4878+ typing .ValuesView [Any ]: 'ValuesView' ,
48364879 # Special Forms
4837- typing .Any ,
4838- typing .NoReturn ,
4839- typing .ClassVar ,
4840- typing .Final ,
4841- typing .Union ,
4842- typing .Optional ,
4843- typing .Literal ,
4844- typing .TypeAlias ,
4845- typing .Concatenate ,
4846- typing .TypeGuard ,
4847- )
4880+ typing .Annotated : 'Annotated' ,
4881+ typing .Any : 'Any' ,
4882+ typing .ClassVar : 'ClassVar' ,
4883+ typing .Concatenate : 'Concatenate' ,
4884+ typing .Final : 'Final' ,
4885+ typing .ForwardRef : 'ForwardRef' ,
4886+ typing .Literal : 'Literal' ,
4887+ typing .NewType : 'NewType' ,
4888+ typing .NoReturn : 'NoReturn' ,
4889+ typing .Optional : 'Optional' ,
4890+ typing .TypeAlias : 'TypeAlias' ,
4891+ typing .TypeGuard : 'TypeGuard' ,
4892+ typing .TypeVar : 'TypeVar' ,
4893+ typing .Union : 'Union' ,
4894+ # Subscribed special forms
4895+ typing .Annotated [Any , "Annotation" ]: 'Annotated' ,
4896+ typing .ClassVar [Any ]: 'ClassVar' ,
4897+ typing .Concatenate [Any , SpecialAttrsP ]: 'Concatenate' ,
4898+ typing .Final [Any ]: 'Final' ,
4899+ typing .Literal [Any ]: 'Literal' ,
4900+ typing .Optional [Any ]: 'Optional' ,
4901+ typing .TypeGuard [Any ]: 'TypeGuard' ,
4902+ typing .Union [Any ]: 'Any' ,
4903+ typing .Union [int , float ]: 'Union' ,
4904+ # Incompatible special forms (tested in test_special_attrs2)
4905+ # - typing.ForwardRef('set[Any]')
4906+ # - typing.NewType('TypeName', Any)
4907+ # - typing.ParamSpec('SpecialAttrsP')
4908+ # - typing.TypeVar('T')
4909+ }
48484910
4849- for cls in cls_to_check :
4911+ for cls , name in cls_to_check . items () :
48504912 with self .subTest (cls = cls ):
4851- self .assertEqual (cls .__name__ , cls ._name )
4852- self .assertEqual (cls .__qualname__ , cls ._name )
4853- self .assertEqual (cls .__module__ , 'typing' )
4913+ self .assertEqual (cls .__name__ , name , str (cls ))
4914+ self .assertEqual (cls .__qualname__ , name , str (cls ))
4915+ self .assertEqual (cls .__module__ , 'typing' , str (cls ))
4916+ self .assertEqual (getattr (cls , '_name' , name ), name , str (cls ))
4917+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4918+ s = pickle .dumps (cls , proto )
4919+ loaded = pickle .loads (s )
4920+ self .assertIs (cls , loaded )
4921+
4922+ TypeName = typing .NewType ('SpecialAttrsTests.TypeName' , Any )
4923+
4924+ def test_special_attrs2 (self ):
4925+ # Forward refs provide a different introspection API. __name__ and
4926+ # __qualname__ make little sense for forward refs as they can store
4927+ # complex typing expressions.
4928+ fr = typing .ForwardRef ('set[Any]' )
4929+ self .assertFalse (hasattr (fr , '__name__' ))
4930+ self .assertFalse (hasattr (fr , '__qualname__' ))
4931+ self .assertEqual (fr .__module__ , 'typing' )
4932+ # Forward refs are currently unpicklable.
4933+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4934+ with self .assertRaises (TypeError ) as exc :
4935+ pickle .dumps (fr , proto )
4936+
4937+ self .assertEqual (SpecialAttrsTests .TypeName .__name__ , 'TypeName' )
4938+ self .assertEqual (
4939+ SpecialAttrsTests .TypeName .__qualname__ ,
4940+ 'SpecialAttrsTests.TypeName' ,
4941+ )
4942+ self .assertEqual (
4943+ SpecialAttrsTests .TypeName .__module__ ,
4944+ 'test.test_typing' ,
4945+ )
4946+ # NewTypes are picklable assuming correct qualname information.
4947+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4948+ s = pickle .dumps (SpecialAttrsTests .TypeName , proto )
4949+ loaded = pickle .loads (s )
4950+ self .assertIs (SpecialAttrsTests .TypeName , loaded )
4951+
4952+ # Type variables don't support non-global instantiation per PEP 484
4953+ # restriction that "The argument to TypeVar() must be a string equal
4954+ # to the variable name to which it is assigned". Thus, providing
4955+ # __qualname__ is unnecessary.
4956+ self .assertEqual (SpecialAttrsT .__name__ , 'SpecialAttrsT' )
4957+ self .assertFalse (hasattr (SpecialAttrsT , '__qualname__' ))
4958+ self .assertEqual (SpecialAttrsT .__module__ , 'test.test_typing' )
4959+ # Module-level type variables are picklable.
4960+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4961+ s = pickle .dumps (SpecialAttrsT , proto )
4962+ loaded = pickle .loads (s )
4963+ self .assertIs (SpecialAttrsT , loaded )
4964+
4965+ self .assertEqual (SpecialAttrsP .__name__ , 'SpecialAttrsP' )
4966+ self .assertFalse (hasattr (SpecialAttrsP , '__qualname__' ))
4967+ self .assertEqual (SpecialAttrsP .__module__ , 'test.test_typing' )
4968+ # Module-level ParamSpecs are picklable.
4969+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4970+ s = pickle .dumps (SpecialAttrsP , proto )
4971+ loaded = pickle .loads (s )
4972+ self .assertIs (SpecialAttrsP , loaded )
48544973
48554974class AllTests (BaseTestCase ):
48564975 """Tests for __all__."""
0 commit comments