@@ -4021,44 +4021,219 @@ def __init__(self, b):
40214021 ('bar' , 2 , ..., "keyword_only" )),
40224022 ...))
40234023
4024- def test_signature_on_class_with_decorated_new (self ):
4024+ def test_signature_on_class_with_decorated_init (self ):
40254025 def identity (func ):
40264026 @functools .wraps (func )
40274027 def wrapped (* args , ** kwargs ):
40284028 return func (* args , ** kwargs )
40294029 return wrapped
40304030
4031- class Foo :
4031+ class C :
40324032 @identity
4033- def __new__ ( cls , a , b ):
4033+ def __init__ ( self , b ):
40344034 pass
40354035
4036- self . assertEqual ( self . signature ( Foo ),
4037- ((( 'a' , ..., ..., "positional_or_keyword" ),
4038- ( 'b' , ..., ..., "positional_or_keyword" )),
4039- ...))
4036+ C ( 1 ) # does not raise
4037+ self . assertEqual ( self . signature ( C ),
4038+ ((( 'b' , ..., ..., "positional_or_keyword" ), ),
4039+ ...))
40404040
4041- self .assertEqual (self .signature (Foo .__new__ ),
4042- ((('cls' , ..., ..., "positional_or_keyword" ),
4043- ('a' , ..., ..., "positional_or_keyword" ),
4044- ('b' , ..., ..., "positional_or_keyword" )),
4045- ...))
4041+ with self .subTest ('classmethod' ):
4042+ class C :
4043+ @classmethod
4044+ @identity
4045+ def __init__ (cls , b ):
4046+ pass
40464047
4047- class Bar :
4048- __new__ = identity (object .__new__ )
4048+ C (1 ) # does not raise
4049+ self .assertEqual (self .signature (C ),
4050+ ((('b' , ..., ..., "positional_or_keyword" ),),
4051+ ...))
40494052
4050- varargs_signature = (
4051- (('args' , ..., ..., 'var_positional' ),
4052- ('kwargs' , ..., ..., 'var_keyword' )),
4053- ...,
4054- )
4053+ with self .subTest ('staticmethod' ):
4054+ class C :
4055+ @staticmethod
4056+ @identity
4057+ def __init__ (b ):
4058+ pass
4059+
4060+ C (1 ) # does not raise
4061+ self .assertEqual (self .signature (C ),
4062+ ((('b' , ..., ..., "positional_or_keyword" ),),
4063+ ...))
4064+
4065+ with self .subTest ('MethodType' ):
4066+ class A :
4067+ @identity
4068+ def call (self , a ):
4069+ pass
4070+
4071+ class C :
4072+ __init__ = A ().call
4073+
4074+ C (1 ) # does not raise
4075+ self .assertEqual (self .signature (C ),
4076+ ((('a' , ..., ..., "positional_or_keyword" ),),
4077+ ...))
4078+
4079+ with self .subTest ('partial' ):
4080+ class C :
4081+ __init__ = identity (functools .partial (lambda x , a , b : None , 2 ))
4082+
4083+ C (1 ) # does not raise
4084+ self .assertEqual (self .signature (C ),
4085+ ((('b' , ..., ..., "positional_or_keyword" ),),
4086+ ...))
4087+
4088+ with self .subTest ('partialmethod' ):
4089+ class C :
4090+ @identity
4091+ def _init (self , x , a ):
4092+ self .a = (x , a )
4093+ __init__ = functools .partialmethod (_init , 2 )
4094+
4095+ self .assertEqual (C (1 ).a , (2 , 1 ))
4096+ self .assertEqual (self .signature (C ),
4097+ ((('a' , ..., ..., "positional_or_keyword" ),),
4098+ ...))
4099+
4100+ class Desc :
4101+ def __init__ (self , func ):
4102+ self .func = identity (func )
4103+
4104+ def __get__ (self , instance , owner ):
4105+ return self .func .__get__ (instance , owner )
4106+
4107+ with self .subTest ('descriptor' ):
4108+ class C :
4109+ __init__ = Desc (lambda self , a : None )
40554110
4056- self .assertEqual (self .signature (Bar ), ((), ...))
4057- self .assertEqual (self .signature (Bar .__new__ ), varargs_signature )
4058- self .assertEqual (self .signature (Bar , follow_wrapped = False ),
4059- varargs_signature )
4060- self .assertEqual (self .signature (Bar .__new__ , follow_wrapped = False ),
4061- varargs_signature )
4111+ C (1 ) # does not raise
4112+ self .assertEqual (self .signature (C ),
4113+ ((('a' , ..., ..., "positional_or_keyword" ),),
4114+ ...))
4115+
4116+ self .assertEqual (self .signature (C .__init__ ),
4117+ ((('self' , ..., ..., "positional_or_keyword" ),
4118+ ('a' , ..., ..., "positional_or_keyword" )),
4119+ ...))
4120+
4121+ varargs_signature = (
4122+ (('args' , ..., ..., 'var_positional' ),
4123+ ('kwargs' , ..., ..., 'var_keyword' )),
4124+ ...,
4125+ )
4126+ self .assertEqual (self .signature (C , follow_wrapped = False ),
4127+ varargs_signature )
4128+ self .assertEqual (self .signature (C .__new__ , follow_wrapped = False ),
4129+ varargs_signature )
4130+
4131+
4132+ def test_signature_on_class_with_decorated_new (self ):
4133+ def identity (func ):
4134+ @functools .wraps (func )
4135+ def wrapped (* args , ** kwargs ):
4136+ return func (* args , ** kwargs )
4137+ return wrapped
4138+
4139+ with self .subTest ('FunctionType' ):
4140+ class C :
4141+ @identity
4142+ def __new__ (cls , a ):
4143+ return a
4144+
4145+ self .assertEqual (C (1 ), 1 )
4146+ self .assertEqual (self .signature (C ),
4147+ ((('a' , ..., ..., "positional_or_keyword" ),),
4148+ ...))
4149+
4150+ # TODO: classmethod is not correct
4151+ # with self.subTest('classmethod'):
4152+ # class C:
4153+ # @classmethod
4154+ # @identity
4155+ # def __new__(cls, cls2, a):
4156+ # return a
4157+
4158+ # self.assertEqual(C(1), 1)
4159+ # self.assertEqual(self.signature(C),
4160+ # ((('a', ..., ..., "positional_or_keyword"),),
4161+ # ...))
4162+
4163+ with self .subTest ('staticmethod' ):
4164+ class C :
4165+ @staticmethod
4166+ @identity
4167+ def __new__ (cls , a ):
4168+ return a
4169+
4170+ self .assertEqual (C (1 ), 1 )
4171+ self .assertEqual (self .signature (C ),
4172+ ((('a' , ..., ..., "positional_or_keyword" ),),
4173+ ...))
4174+
4175+ # TODO: method type is not correct
4176+ # with self.subTest('MethodType'):
4177+ # class A:
4178+ # @identity
4179+ # def call(self, cls, a):
4180+ # return a
4181+ # class C:
4182+ # __new__ = A().call
4183+
4184+ # self.assertEqual(C(1), 1)
4185+ # self.assertEqual(self.signature(C),
4186+ # ((('a', ..., ..., "positional_or_keyword"),),
4187+ # ...))
4188+
4189+ with self .subTest ('partial' ):
4190+ class C :
4191+ __new__ = identity (functools .partial (lambda x , cls , a : (x , a ), 2 ))
4192+
4193+ self .assertEqual (C (1 ), (2 , 1 ))
4194+ self .assertEqual (self .signature (C ),
4195+ ((('a' , ..., ..., "positional_or_keyword" ),),
4196+ ...))
4197+
4198+ with self .subTest ('partialmethod' ):
4199+ class C :
4200+ __new__ = functools .partialmethod (identity (lambda cls , x , a : (x , a )), 2 )
4201+
4202+ self .assertEqual (C (1 ), (2 , 1 ))
4203+ self .assertEqual (self .signature (C ),
4204+ ((('a' , ..., ..., "positional_or_keyword" ),),
4205+ ...))
4206+
4207+ class Desc :
4208+ def __init__ (self , func ):
4209+ self .func = identity (func )
4210+
4211+ def __get__ (self , instance , owner ):
4212+ return self .func .__get__ (instance , owner )
4213+
4214+ with self .subTest ('descriptor' ):
4215+ class C :
4216+ __new__ = Desc (lambda cls , a : a )
4217+
4218+ self .assertEqual (C (1 ), 1 )
4219+ self .assertEqual (self .signature (C ),
4220+ ((('a' , ..., ..., "positional_or_keyword" ),),
4221+ ...))
4222+
4223+ self .assertEqual (self .signature (C .__new__ ),
4224+ ((('cls' , ..., ..., "positional_or_keyword" ),
4225+ ('a' , ..., ..., "positional_or_keyword" )),
4226+ ...))
4227+
4228+ varargs_signature = (
4229+ (('args' , ..., ..., 'var_positional' ),
4230+ ('kwargs' , ..., ..., 'var_keyword' )),
4231+ ...,
4232+ )
4233+ self .assertEqual (self .signature (C , follow_wrapped = False ),
4234+ varargs_signature )
4235+ self .assertEqual (self .signature (C .__new__ , follow_wrapped = False ),
4236+ varargs_signature )
40624237
40634238 def test_signature_on_class_with_init (self ):
40644239 class C :
0 commit comments