我需要多次调用多参数函数,同时除了一个参数之外的所有参数都是固定的。我正在考虑使用装饰器:
# 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/