Commit e7dcc5e9 authored by Yury Selivanov's avatar Yury Selivanov

inspect.signature: Support classes without user-defined __init__/__new__ #20308

parent 7aedea40
...@@ -1561,6 +1561,17 @@ def signature(obj): ...@@ -1561,6 +1561,17 @@ def signature(obj):
init = _get_user_defined_method(obj, '__init__') init = _get_user_defined_method(obj, '__init__')
if init is not None: if init is not None:
sig = signature(init) sig = signature(init)
if sig is None:
if type in obj.__mro__:
# 'obj' is a metaclass without user-defined __init__
# or __new__. Return a signature of 'type' builtin.
return signature(type)
else:
# We have a class (not metaclass), but no user-defined
# __init__ or __new__ for it
return signature(object)
elif not isinstance(obj, _NonUserDefinedCallables): elif not isinstance(obj, _NonUserDefinedCallables):
# An object with __call__ # An object with __call__
# We also check that the 'obj' is not an instance of # We also check that the 'obj' is not an instance of
......
...@@ -2045,6 +2045,20 @@ class TestSignatureObject(unittest.TestCase): ...@@ -2045,6 +2045,20 @@ class TestSignatureObject(unittest.TestCase):
('bar', 2, ..., "keyword_only")), ('bar', 2, ..., "keyword_only")),
...)) ...))
# Test classes without user-defined __init__ or __new__
class C: pass
self.assertEqual(str(inspect.signature(C)), '()')
class D(C): pass
self.assertEqual(str(inspect.signature(D)), '()')
# Test meta-classes without user-defined __init__ or __new__
class C(type): pass
self.assertEqual(str(inspect.signature(C)),
'(object_or_name, bases, dict)')
class D(C): pass
self.assertEqual(str(inspect.signature(D)),
'(object_or_name, bases, dict)')
def test_signature_on_callable_objects(self): def test_signature_on_callable_objects(self):
class Foo: class Foo:
def __call__(self, a): def __call__(self, a):
......
...@@ -13,6 +13,9 @@ Core and Builtins ...@@ -13,6 +13,9 @@ Core and Builtins
Library Library
------- -------
- Issue #20308: inspect.signature now works on classes without user-defined
__init__ or __new__ methods.
What's New in Python 3.4.0 Beta 3? What's New in Python 3.4.0 Beta 3?
================================== ==================================
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment