为什么包装装饰器显示额外的逗号?

问题描述

我想打印函数调用的参数和返回值。我们知道装饰器能够在每次调用它所包装的函数之前和之后运行额外的代码

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 而不是 {{1} }

*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)