diff -r 1a6cb184e939 Lib/inspect.py --- a/Lib/inspect.py Mon Jan 28 13:26:25 2013 +0200 +++ b/Lib/inspect.py Fri Feb 08 16:48:33 2013 +0100 @@ -1360,7 +1360,7 @@ else: return signature(wrapped) - if isinstance(obj, types.FunctionType): + if isfunction(obj): return Signature.from_function(obj) if isinstance(obj, functools.partial): @@ -1438,7 +1438,7 @@ # __call__, __new__, or __init__ methods return sig.replace(parameters=tuple(sig.parameters.values())[1:]) - if isinstance(obj, types.BuiltinFunctionType): + if isbuiltin(obj): # Raise a nicer error message for builtins msg = 'no signature found for builtin function {!r}'.format(obj) raise ValueError(msg) @@ -1775,9 +1775,6 @@ def from_function(cls, func): '''Constructs Signature for the given python function''' - if not isinstance(func, types.FunctionType): - raise TypeError('{!r} is not a Python function'.format(func)) - Parameter = cls._parameter_cls # Parameter information. diff -r 1a6cb184e939 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Mon Jan 28 13:26:25 2013 +0200 +++ b/Lib/test/test_inspect.py Fri Feb 08 16:48:33 2013 +0100 @@ -1456,9 +1456,23 @@ with self.assertRaisesRegex(TypeError, 'is not a callable object'): inspect.signature(42) - with self.assertRaisesRegex(TypeError, 'is not a Python function'): + with self.assertRaisesRegex(AttributeError, 'int.*object has no attribute.*__code__'): inspect.Signature.from_function(42) + def test_signature_from_functionlike_object(self): + def func(a,b, *args, kwonly=True, kwonlyreq, **kwargs): + pass + + class funclike: + __code__ = func.__code__ + __annotations__ = func.__annotations__ + __defaults__ = func.__defaults__ + __kwdefaults__ = func.__kwdefaults__ + + sig_func = inspect.Signature.from_function(func) + sig_funclike = inspect.Signature.from_function(funclike()) + self.assertEqual(sig_funclike, sig_func) + def test_signature_on_method(self): class Test: def foo(self, arg1, arg2=1) -> int: