在下面的示例代码中,我们有一个未修饰的函数fun()
和一个装饰的wrappedfun()
。
对于未修饰的函数fun
,在函数名后面的左括号后按下IPython笔记本中的TAB会将调用签名显示为fun(x=0, y=1)
,但对于装饰版本wrappedfun
,您将获得完成为wrappedfun(*args, **kwargs)
。有没有办法告诉IPython在TAB完成期间显示原始呼叫签名?
from functools import wraps
def mywrapper(func):
''' simple wrapper '''
@wraps(func)
def wrapper(*args, **kwargs):
print('inside wrapper')
return func(*args, **kwargs)
return wrapper
def fun(x=0, y=1):
''' Docstring for fun '''
return x + y
@mywrapper
def wrappedfun(x=0, y=1):
''' Docstring for wrapped another fun '''
return x + y
答案 0 :(得分:1)
我认为问题在于:
def wrapper(*args, **kwargs):
print('inside wrapper')
return func(*args, **kwargs)
即使它@wraps(func)
,wrapper
可能需要更多参数,因此您看到的签名是wrapper
的签名。没有办法神奇地知道你想做什么。
这不是特定于IPython的,并且可以在像Preserving signature of decorated function这样的堆栈溢出的其他地方找到。希望这能解决你的问题。