mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
inspect.signature: Support classes without user-defined __init__/__new__ #20308
This commit is contained in:
parent
7aedea40d6
commit
e7dcc5e97a
3 changed files with 28 additions and 0 deletions
|
@ -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):
|
||||||
('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
|
||||||
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?
|
||||||
==================================
|
==================================
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue