summaryrefslogtreecommitdiff
path: root/sphinx/util
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2013-09-16 10:36:16 +0200
committerGeorg Brandl <georg@python.org>2013-09-16 10:36:16 +0200
commit3e04abf47be999abcdea773893e4b7db1a71e9ce (patch)
tree3e3c01b8f1a0369471d640629889c689e70b7dc5 /sphinx/util
parent58acc275e53aad66555680c4bddc2e8275e16969 (diff)
downloadsphinx-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.py38
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."""