前面一些没有争议的背景实验:
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
Run Code Online (Sandbox Code Playgroud)
如何实现我的装饰器以便print(inspect.signature(wrapped))吐出“(baz, foo, bar)”?我可以通过添加传入的_wrapper参数然后粘贴到列表来动态构建吗?fnbaz
答案不是
def decorator(fn):
@functools.wraps(fn)
def _wrapper(baz, *args, *kwargs):
fn(*args, **kwargs)
return _wrapper
Run Code Online (Sandbox Code Playgroud)
再次给出“(foo, bar)”——这是完全错误的。调用wrapped(foo=1, bar=2)是一个类型错误 - “缺少 1 个必需的位置参数:'baz'”
我认为没有必要如此迂腐,但是
def decorator(fn):
def _wrapper(baz, foo, bar):
fn(foo=foo, bar=bar)
return _wrapper …Run Code Online (Sandbox Code Playgroud)