diff -r 3544827d42e6 Lib/inspect.py --- a/Lib/inspect.py Tue Jan 28 12:26:24 2014 -0500 +++ b/Lib/inspect.py Tue Jan 28 16:02:24 2014 -0500 @@ -1520,13 +1520,6 @@ if not callable(obj): raise TypeError('{!r} is not a callable object'.format(obj)) - if (isinstance(obj, _NonUserDefinedCallables) or - ismethoddescriptor(obj) or - isinstance(obj, type)): - sig = Signature.from_builtin(obj) - if sig: - return sig - if isinstance(obj, types.MethodType): # In this case we skip the first parameter of the underlying # function (usually `self` or `cls`). @@ -1564,6 +1557,13 @@ return sig.replace(parameters=new_params) + if (isinstance(obj, _NonUserDefinedCallables) or + ismethoddescriptor(obj) or + isinstance(obj, type)): + sig = Signature.from_builtin(obj) + if sig: + return sig + if isinstance(obj, types.FunctionType): return Signature.from_function(obj) diff -r 3544827d42e6 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Tue Jan 28 12:26:24 2014 -0500 +++ b/Lib/test/test_inspect.py Tue Jan 28 16:02:24 2014 -0500 @@ -1655,6 +1655,21 @@ __call__ = type test_callable(ThisWorksNow()) + @unittest.skipIf(MISSING_C_DOCSTRINGS, + "Signature information for builtins requires docstrings") + def test_signature_on_decorated_builtins(self): + func = _testcapi.docstring_with_signature_with_defaults + + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs) -> int: + return func(*args, **kwargs) + return wrapper + + decorated_func = decorator(func) + + self.assertEqual(inspect.signature(func), + inspect.signature(decorated_func)) def test_signature_on_builtins_no_signature(self): with self.assertRaisesRegex(ValueError, 'no signature found for builtin'):