diff options
author | Georg Brandl <georg@python.org> | 2013-09-16 10:36:16 +0200 |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2013-09-16 10:36:16 +0200 |
commit | 3e04abf47be999abcdea773893e4b7db1a71e9ce (patch) | |
tree | 3e3c01b8f1a0369471d640629889c689e70b7dc5 /sphinx/util | |
parent | 58acc275e53aad66555680c4bddc2e8275e16969 (diff) | |
download | sphinx-3e04abf47be999abcdea773893e4b7db1a71e9ce.tar.gz |
Closes #828: use inspect.getfullargspec() to be able to document functions with
keyword-only arguments on Python 3.
Diffstat (limited to 'sphinx/util')
-rw-r--r-- | sphinx/util/inspect.py | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 95b7cb1e..0212eb7e 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -19,7 +19,43 @@ from sphinx.util import force_decode from sphinx.util.pycompat import bytes -if sys.version_info >= (2, 5): +if sys.version_info >= (3, 0): + from functools import partial + def getargspec(func): + """Like inspect.getargspec but supports functools.partial as well.""" + if inspect.ismethod(func): + func = func.__func__ + if type(func) is partial: + orig_func = func.func + argspec = inspect.getfullargspec(orig_func) + args = list(argspec[0]) + defaults = list(argspec[3]) + kwoargs = list(argspec[4]) + kwodefs = dict(argspec[5]) + if func.args: + args = args[len(func.args):] + for arg in func.keywords or (): + try: + i = args.index(arg) - len(args) + del args[i] + try: + del defaults[i] + except IndexError: + pass + except ValueError: # must be a kwonly arg + i = kwoargs.index(arg) + del kwoargs[i] + del kwodefs[arg] + return inspect.FullArgSpec(args, argspec[1], argspec[2], + tuple(defaults), kwoargs, + kwodefs, argspec[6]) + while hasattr(func, '__wrapped__'): + func = func.__wrapped__ + if not inspect.isfunction(func): + raise TypeError('%r is not a Python function' % func) + return inspect.getfullargspec(func) + +elif sys.version_info >= (2, 5): from functools import partial def getargspec(func): """Like inspect.getargspec but supports functools.partial as well.""" |