Skip to content

Commit dca94be

Browse files
authored
test: add decorated tests
1 parent cbab1ea commit dca94be

File tree

1 file changed

+200
-25
lines changed

1 file changed

+200
-25
lines changed

Lib/test/test_inspect/test_inspect.py

Lines changed: 200 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)