为什么包装装饰器显示额外的逗号?
Why wraps decorator is showing extra commas?
我想打印函数调用的参数和 return 值。我们知道装饰器有能力在每次调用它包装的函数前后 运行 附加代码。
from functools import wraps
def trace(func):
@wraps(func)
def wrapper(*args):
result = func(*args)
print(f'{func.__name__}{args!r}' f'->{result!r}')
return result
return wrapper
@trace
def fibo(n):
if n in (0, 1):
return n
return fibo(n-2)+fibo(n-1)
fib = trace(fibo)
fib(3)
输出
fibo(1,)->1
fibo(0,)->0
fibo(1,)->1
fibo(2,)->1
fibo(3,)->2
fibo(3,)->2
您已经看到我在包装函数中只传递了一个 args
值。我的问题是为什么它在 fibo(1,)..fibo(3,)
输出函数中显示一个额外的逗号以及如何修复它?
args
是一个元组,在你的情况下它是一个 1 元组,至于“修复”它,确保你只传递一个参数并将它接收为 args
而不是 *args
from functools import wraps
def trace(func):
@wraps(func)
def wrapper(args):
result = func(args)
print(f'{func.__name__}({args!r})' f'->{result!r}')
return result
return wrapper
fib(3)
你得到
fibo(1)->1
fibo(0)->0
fibo(1)->1
fibo(2)->1
fibo(3)->2
fibo(3)->2
我想打印函数调用的参数和 return 值。我们知道装饰器有能力在每次调用它包装的函数前后 运行 附加代码。
from functools import wraps
def trace(func):
@wraps(func)
def wrapper(*args):
result = func(*args)
print(f'{func.__name__}{args!r}' f'->{result!r}')
return result
return wrapper
@trace
def fibo(n):
if n in (0, 1):
return n
return fibo(n-2)+fibo(n-1)
fib = trace(fibo)
fib(3)
输出
fibo(1,)->1
fibo(0,)->0
fibo(1,)->1
fibo(2,)->1
fibo(3,)->2
fibo(3,)->2
您已经看到我在包装函数中只传递了一个 args
值。我的问题是为什么它在 fibo(1,)..fibo(3,)
输出函数中显示一个额外的逗号以及如何修复它?
args
是一个元组,在你的情况下它是一个 1 元组,至于“修复”它,确保你只传递一个参数并将它接收为 args
而不是 *args
from functools import wraps
def trace(func):
@wraps(func)
def wrapper(args):
result = func(args)
print(f'{func.__name__}({args!r})' f'->{result!r}')
return result
return wrapper
fib(3)
你得到
fibo(1)->1
fibo(0)->0
fibo(1)->1
fibo(2)->1
fibo(3)->2
fibo(3)->2