一些没有争议的背景实验:
import inspect
def func(foo, bar):
pass
print(inspect.signature(func)) # Prints "(foo, bar)" like you'd expect
def decorator(fn):
def _wrapper(baz, *args, *kwargs):
fn(*args, **kwargs)
return _wrapper
wrapped = decorator(func)
print(inspect.signature(wrapped)) # Prints "(baz, *args, **kwargs)" which is totally understandable
问题是
如何实现我的装饰,使print(inspect.signature(wrapped))
吐出"(巴,福,wine 吧)"呢?我可以通过添加传入的fn
的参数,然后将baz
粘贴到列表中,以某种方式动态构建_wrapper
吗?
答案是否定的
def decorator(fn):
@functools.wraps(fn)
def _wrapper(baz, *args, *kwargs):
fn(*args, **kwargs)
return _wrapper
那又是"foo,bar",这完全是错误的.调用wrapped(foo=1, bar=2)
是一个类型错误——"缺少1个必需的位置参数:'baz'"
我觉得没必要这么迂腐,但是
def decorator(fn):
def _wrapper(baz, foo, bar):
fn(foo=foo, bar=bar)
return _wrapper
这也不是我想要的答案——我希望装饰师能够处理所有功能.