python - 使用装饰器设置参数与嵌套函数

标签 python decorator python-decorators

我需要多次调用多参数函数,同时除了一个参数之外的所有参数都是固定的。我正在考虑使用装饰器:

# V1 - with @decorator
def dec_adder(num):
    def wrap(fun):
        def wrapped_fun(n1):
            return fun(n1, second_num=num)
        return wrapped_fun
    return wrap

@dec_adder(2)
def adder(first_num, second_num):
    return first_num + second_num

print adder(5)
>>> 7

但这似乎令人困惑,因为它似乎正在调用一个只有一个参数的 2 参数函数 adder

另一种方法是使用嵌套函数定义,该定义使用父函数中的局部变量:

# V2 - without @decorator
def add_wrapper(num):
    def wrapped_adder(num_2):
        return num + num_2
    return wrapped_adder

adder = add_wrapper(2)
print adder(5)
>>> 7

但是我犹豫是否使用这种方法,因为在我的实际实现中,包装的函数非常复杂。我的直觉是它应该有一个独立的定义。

如果这涉及到观点领域,请原谅我,但是这两种方法是否被认为是更好的设计和/或更Pythonic?我还应该考虑其他方法吗?

最佳答案

functools.partial在这种情况下应该可以很好地工作:

from functools import partial

def adder(n1, n2):
    return n1 + n2

adder_2 = partial(adder, 2)

adder_2(5)

它的文档字符串:

partial(func, *args, **keywords) - new function with partial application of the given arguments and keywords.

-- 所以,您也可以设置关键字参数。

附注

遗憾的是,内置的 sum 不适合这种情况:它对一个可迭代对象进行求和(事实上,sum(iterable[, start]) -> value ),所以 partial(sum, 2) 不起作用。

关于python - 使用装饰器设置参数与嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385991/

相关文章:

python - Pandas csv itertools 组合

python - PyQt:如何在选择项目时保持 ComboBox 打开

python - 如何通过装饰器获取底层函数参数信息?

python - 有没有办法将装饰器应用于需要类信息的 Python 方法?

java - 将java项目中的proto文件编译成python模块时如何避免嵌套导入

python - 将 Gekko 方程中的负值设置为零?

使用装饰器进行 Python 日志记录

python - 类中每个方法的标准日志记录

python - 正确使用装饰器

python - Odoo - 用新的 api 覆盖旧的 api 方法?