gpt4 book ai didi

python - 如何在不更改参数名称的情况下装饰 Python 函数?

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:41 24 4
gpt4 key购买 nike

以下 Python 代码定义了一个记录器和一个阶乘函数,然后使用关键字参数调用阶乘函数:

def logger(f):
def f_(a):
print("Call", a)
return f(a)
return f_

# @logger # uncomment this line to see the problem
def factorial(n):
return 1 if n == 0 else n * factorial(n-1)

print(factorial(n=5))

产生以下输出(如预期):120

现在如果我取消注释记录器装饰器,我会得到一个错误,因为参数的名称变成了 a 而不是 n:

如何在不更改参数名称的情况下修饰函数(如阶乘)?

最佳答案

忽略装饰器语法,这是你正在做的:

def logger(f):
def f_(a):
print("Call", a)
return f(a)
return f_

def factorial(n):
return 1 if n == 0 else n * factorial(n-1)

# `factorial` is `def f_(a):` now
factorial = logger(factorial)

因此,要简单地解决这个问题,请使用相同的声明,或者不要使用关键字参数 (n=5)


更正此问题的更好方法是在内部函数中使用解包:

import functools

def logger(f):
@functools.wraps(f)
def f_(*args, **kwargs):
print("Call", f.__name__, *args, *[f"{k}={v!r}" for k, v in kwargs.items()])
return f(*args, **kwargs)
return f_

Here's a useful article on the topic.

关于python - 如何在不更改参数名称的情况下装饰 Python 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53521993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com