diff options
author | Yann Kaiser <kaiser.yann@gmail.com> | 2013-10-14 02:50:04 +0100 |
---|---|---|
committer | Yann Kaiser <kaiser.yann@gmail.com> | 2013-10-14 02:50:04 +0100 |
commit | e9822685f7d0f653e49b639b1b88cd196cf5fd48 (patch) | |
tree | dd7a10fd55e5b119c9744f9f7a893b99a22425cc /funcsigs | |
parent | 59ab8ac5ea71d5b5163be0b12d5447969b252c43 (diff) | |
download | funcsigs-e9822685f7d0f653e49b639b1b88cd196cf5fd48.tar.gz |
Fixed unbound methods getting their first parameter curried
Diffstat (limited to 'funcsigs')
-rw-r--r-- | funcsigs/__init__.py | 16 |
1 files changed, 13 insertions, 3 deletions
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__ |