summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/inspect.py11
-rw-r--r--Lib/test/test_inspect.py14
-rw-r--r--Misc/NEWS3
3 files changed, 28 insertions, 0 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 9436e35..2211b8d 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1561,6 +1561,17 @@ def signature(obj):
init = _get_user_defined_method(obj, '__init__')
if init is not None:
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):
# An object with __call__
# We also check that the 'obj' is not an instance of
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index f5f18f0..a6b4c7a 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -2045,6 +2045,20 @@ class TestSignatureObject(unittest.TestCase):
('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):
class Foo:
def __call__(self, a):
diff --git a/Misc/NEWS b/Misc/NEWS
index 6d528be..e1050c6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@ Core and Builtins
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?
==================================