diff -r 1166b3321012 Lib/inspect.py --- a/Lib/inspect.py Thu Feb 13 12:48:54 2014 +0100 +++ b/Lib/inspect.py Thu Feb 13 17:44:37 2014 -0500 @@ -1895,14 +1895,14 @@ return sig.replace(parameters=new_params) - if _signature_is_builtin(obj): - return Signature.from_builtin(obj) - if isfunction(obj) or _signature_is_functionlike(obj): # If it's a pure Python function, or an object that is duck type # of a Python function (Cython functions, for instance), then: return Signature.from_function(obj) + if _signature_is_builtin(obj): + return Signature.from_builtin(obj) + if isinstance(obj, functools.partial): wrapped_sig = signature(obj.func) return _signature_get_partial(wrapped_sig, obj) diff -r 1166b3321012 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Thu Feb 13 12:48:54 2014 +0100 +++ b/Lib/test/test_inspect.py Thu Feb 13 17:44:37 2014 -0500 @@ -14,6 +14,7 @@ import types import unicodedata import unittest +import unittest.mock try: from concurrent.futures import ThreadPoolExecutor @@ -1789,6 +1790,21 @@ ('kwargs', ..., ..., "var_keyword")), ...)) + # Test with cython-like builtins: + _orig_isdesc = inspect.ismethoddescriptor + def _isdesc(obj): + if hasattr(obj, '_builtinmock'): + return True + return _orig_isdesc(obj) + + with unittest.mock.patch('inspect.ismethoddescriptor', _isdesc): + builtin_func = funclike(func) + # Make sure that our mock setup is working + self.assertFalse(inspect.ismethoddescriptor(builtin_func)) + builtin_func._builtinmock = True + self.assertTrue(inspect.ismethoddescriptor(builtin_func)) + self.assertEqual(inspect.signature(builtin_func), sig_func) + def test_signature_functionlike_class(self): # We only want to duck type function-like objects, # not classes.