Skip to content

Commit 0e63bd5

Browse files
Add tests for wrapped metaclass __call__
1 parent 43cc52f commit 0e63bd5

1 file changed

Lines changed: 73 additions & 0 deletions

File tree

Lib/test/test_inspect/test_inspect.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4042,6 +4042,79 @@ def __init__(self, b):
40424042
('bar', 2, ..., "keyword_only")),
40434043
...))
40444044

4045+
def test_signature_on_class_with_wrapped_metaclass_call(self):
4046+
class CM(type):
4047+
@identity
4048+
def __call__(cls, a):
4049+
pass
4050+
class C(metaclass=CM):
4051+
def __init__(self, b):
4052+
pass
4053+
4054+
self.assertEqual(self.signature(C),
4055+
((('a', ..., ..., "positional_or_keyword"),),
4056+
...))
4057+
4058+
with self.subTest('classmethod'):
4059+
class CM(type):
4060+
@classmethod
4061+
@identity
4062+
def __call__(cls, a):
4063+
return a
4064+
class C(metaclass=CM):
4065+
def __init__(self, b):
4066+
pass
4067+
4068+
self.assertEqual(C(1), 1)
4069+
self.assertEqual(self.signature(C),
4070+
((('a', ..., ..., "positional_or_keyword"),),
4071+
...))
4072+
4073+
with self.subTest('staticmethod'):
4074+
class CM(type):
4075+
@staticmethod
4076+
@identity
4077+
def __call__(a):
4078+
return a
4079+
class C(metaclass=CM):
4080+
def __init__(self, b):
4081+
pass
4082+
4083+
self.assertEqual(C(1), 1)
4084+
self.assertEqual(self.signature(C),
4085+
((('a', ..., ..., "positional_or_keyword"),),
4086+
...))
4087+
4088+
with self.subTest('MethodType'):
4089+
class A:
4090+
@identity
4091+
def call(self, a):
4092+
return a
4093+
class CM(type):
4094+
__call__ = A().call
4095+
class C(metaclass=CM):
4096+
def __init__(self, b):
4097+
pass
4098+
4099+
self.assertEqual(C(1), 1)
4100+
self.assertEqual(self.signature(C),
4101+
((('a', ..., ..., "positional_or_keyword"),),
4102+
...))
4103+
4104+
with self.subTest('descriptor'):
4105+
class CM(type):
4106+
@DescWithDeco
4107+
def __call__(self, a):
4108+
return a
4109+
class C(metaclass=CM):
4110+
def __init__(self, b):
4111+
pass
4112+
4113+
self.assertEqual(C(1), 1)
4114+
self.assertEqual(self.signature(C),
4115+
((('a', ..., ..., "positional_or_keyword"),),
4116+
...))
4117+
40454118
def test_signature_on_class_with_decorated_init(self):
40464119
class C:
40474120
@identity

0 commit comments

Comments
 (0)