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:26:22 2014 -0500 @@ -1514,18 +1514,22 @@ return sig.replace(parameters=params) +def _signature_is_builtin(obj): + return (isinstance(obj, _NonUserDefinedCallables) or + ismethoddescriptor(obj) or + # Can't test 'isinstance(type)' here, as it would + # also be True for regular python classes + obj in (type, object)) + + def signature(obj): '''Get a signature object for the passed callable.''' 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 _signature_is_builtin(obj): + return Signature.from_builtin(obj) if isinstance(obj, types.MethodType): # In this case we skip the first parameter of the underlying @@ -2015,9 +2019,13 @@ @classmethod def from_builtin(cls, func): + if not _signature_is_builtin(func): + raise TypeError("{!r} is not a Python builtin " + "function".format(func)) + s = getattr(func, "__text_signature__", None) if not s: - return None + raise ValueError("no signature found for builtin {!r}".format(func)) Parameter = cls._parameter_cls @@ -2036,9 +2044,10 @@ try: module = ast.parse(s) except SyntaxError: - return None + module = None + if not isinstance(module, ast.Module): - return None + raise ValueError("{!r} builtin has invalid signature".format(func)) f = module.body[0] @@ -2147,7 +2156,6 @@ return cls(parameters, return_annotation=cls.empty) - @property def parameters(self): return self._parameters 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:26:22 2014 -0500 @@ -1667,6 +1667,10 @@ with self.assertRaisesRegex(TypeError, 'is not a Python function'): inspect.Signature.from_function(42) + def test_signature_from_builtin_errors(self): + with self.assertRaisesRegex(TypeError, 'is not a Python builtin'): + inspect.Signature.from_builtin(42) + def test_signature_on_method(self): class Test: def __init__(*args):