Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8dfb457

Browse files
committed
inspect.signature: Check for function-like objects before builtins. Issue #17159
1 parent e2df3ea commit 8dfb457

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

Lib/inspect.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,15 +1911,15 @@ def _signature_internal(obj, follow_wrapper_chains=True, skip_bound_arg=True):
19111911

19121912
return sig.replace(parameters=new_params)
19131913

1914-
if _signature_is_builtin(obj):
1915-
return _signature_from_builtin(Signature, obj,
1916-
skip_bound_arg=skip_bound_arg)
1917-
19181914
if isfunction(obj) or _signature_is_functionlike(obj):
19191915
# If it's a pure Python function, or an object that is duck type
19201916
# of a Python function (Cython functions, for instance), then:
19211917
return Signature.from_function(obj)
19221918

1919+
if _signature_is_builtin(obj):
1920+
return _signature_from_builtin(Signature, obj,
1921+
skip_bound_arg=skip_bound_arg)
1922+
19231923
if isinstance(obj, functools.partial):
19241924
wrapped_sig = _signature_internal(obj.func,
19251925
follow_wrapper_chains,

Lib/test/test_inspect.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import types
1515
import unicodedata
1616
import unittest
17+
import unittest.mock
1718

1819
try:
1920
from concurrent.futures import ThreadPoolExecutor
@@ -1836,6 +1837,21 @@ def __call__(self, *args, **kwargs):
18361837
('kwargs', ..., ..., "var_keyword")),
18371838
...))
18381839

1840+
# Test with cython-like builtins:
1841+
_orig_isdesc = inspect.ismethoddescriptor
1842+
def _isdesc(obj):
1843+
if hasattr(obj, '_builtinmock'):
1844+
return True
1845+
return _orig_isdesc(obj)
1846+
1847+
with unittest.mock.patch('inspect.ismethoddescriptor', _isdesc):
1848+
builtin_func = funclike(func)
1849+
# Make sure that our mock setup is working
1850+
self.assertFalse(inspect.ismethoddescriptor(builtin_func))
1851+
builtin_func._builtinmock = True
1852+
self.assertTrue(inspect.ismethoddescriptor(builtin_func))
1853+
self.assertEqual(inspect.signature(builtin_func), sig_func)
1854+
18391855
def test_signature_functionlike_class(self):
18401856
# We only want to duck type function-like objects,
18411857
# not classes.

0 commit comments

Comments
 (0)