getargspec.py
86 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
/ traitlets / getargspec.py
Min RK
|
r20818 | # -*- coding: utf-8 -*- | ||
""" | ||||
getargspec excerpted from: | ||||
sphinx.util.inspect | ||||
~~~~~~~~~~~~~~~~~~~ | ||||
Helpers for inspecting Python modules. | ||||
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. | ||||
:license: BSD, see LICENSE for details. | ||||
""" | ||||
import inspect | ||||
from IPython.utils.py3compat import PY3 | ||||
# Unmodified from sphinx below this line | ||||
if PY3: | ||||
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 = getargspec(orig_func) | ||||
args = list(argspec[0]) | ||||
defaults = list(argspec[3] or ()) | ||||
kwoargs = list(argspec[4]) | ||||
kwodefs = dict(argspec[5] or {}) | ||||
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) | ||||
else: # 2.6, 2.7 | ||||
from functools import partial | ||||
def getargspec(func): | ||||
"""Like inspect.getargspec but supports functools.partial as well.""" | ||||
if inspect.ismethod(func): | ||||
func = func.__func__ | ||||
parts = 0, () | ||||
if type(func) is partial: | ||||
keywords = func.keywords | ||||
if keywords is None: | ||||
keywords = {} | ||||
parts = len(func.args), keywords.keys() | ||||
func = func.func | ||||
if not inspect.isfunction(func): | ||||
raise TypeError('%r is not a Python function' % func) | ||||
args, varargs, varkw = inspect.getargs(func.__code__) | ||||
func_defaults = func.__defaults__ | ||||
if func_defaults is None: | ||||
func_defaults = [] | ||||
else: | ||||
func_defaults = list(func_defaults) | ||||
if parts[0]: | ||||
args = args[parts[0]:] | ||||
if parts[1]: | ||||
for arg in parts[1]: | ||||
i = args.index(arg) - len(args) | ||||
del args[i] | ||||
try: | ||||
del func_defaults[i] | ||||
except IndexError: | ||||
pass | ||||
return inspect.ArgSpec(args, varargs, varkw, func_defaults) | ||||