Python装饰器,用于向函数添加新参数



我有一个带有两个参数a和b的加法函数,它简单地将a和b相加。为了将这个数字四舍五入,我做了一个decorator factory,它接受一个小数参数,并将加法函数的结果四舍五入到指定的小数数。然而,这需要在函数定义时设置小数。我正在寻找一个更动态的方法。

是否可以让装饰器改变加法函数,使加法函数获得一个新参数&;decimals"?下面是我的代码:

import functools

def rounding(decimals):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return round(func(*args, **kwargs), decimals)
return wrapper
return decorator

@rounding(decimals=2)
def addition(a: float, b: float):
return a + b
addition(a=1.0003, b=2.01)

这使得加法函数总是四舍五入到2位小数。相反,我想让装饰器添加一个新参数,这样我就可以调用

addition(a=1.0003, b=2.01, decimals=2)

是否有办法做到这一点,如果是,是否有办法做到这一点,使函数文档仍然显示a, b和小数,而不是*args, **kwargs(例如,当在函数上按下pycharm中的ctrl+ p时)

我刚刚开始使用python装饰器。我用https://realpython.com/primer-on-python-decorators/作为灵感来源。我没能在这个网站上找到一个现有的答案。我得到的最接近的是与这里的部分函数有关,但也许我只是在寻找错误的东西。

我正在使用Python 3.10.

你把它弄得太复杂了。

  1. 你不想要一个接受参数的装饰器,所以你只需要两层嵌套函数。

  2. 只需将decimals参数添加到装饰器返回的函数中。

def rounding():
@functools.wraps(func)
def wrapper(a, b, decimals):
return round(func(a, b), decimals)
return wrapper

最新更新