From e9822685f7d0f653e49b639b1b88cd196cf5fd48 Mon Sep 17 00:00:00 2001 From: Yann Kaiser Date: Mon, 14 Oct 2013 02:50:04 +0100 Subject: Fixed unbound methods getting their first parameter curried --- funcsigs/__init__.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'funcsigs') diff --git a/funcsigs/__init__.py b/funcsigs/__init__.py index b9ba326..7dbe0dc 100644 --- a/funcsigs/__init__.py +++ b/funcsigs/__init__.py @@ -59,10 +59,20 @@ def signature(obj): raise TypeError('{0!r} is not a callable object'.format(obj)) if isinstance(obj, types.MethodType): - # In this case we skip the first parameter of the underlying - # function (usually `self` or `cls`). sig = signature(obj.__func__) - return sig.replace(parameters=tuple(sig.parameters.values())[1:]) + if obj.__self__ is None: + # Unbound method: the first parameter becomes positional-only + if sig.parameters: + first = sig.parameters.values()[0].replace( + kind=_POSITIONAL_ONLY) + return sig.replace(parameters=itertools.chain( + (first,), tuple(sig.parameters.values())[1:])) + else: + return sig + else: + # In this case we skip the first parameter of the underlying + # function (usually `self` or `cls`). + return sig.replace(parameters=tuple(sig.parameters.values())[1:]) try: sig = obj.__signature__ -- cgit v1.2.3