有没有办法编写一个接受某些参数的函数来修改多个现有函数?
例如,如果我有:
def add(a, b):
return a + b
def minus(a, b):
return a - b
def offset_b(func, n):
(??) func(a, b - n)
然后我想执行下面操作:
offset_b(add(1, 2), 0.5)
offset_b(minus(1, 2), 0.5)
我知道有一种方法可以做到这一点:
def new_b(b):
return b-0.5
add(1, new_b(b))
minus(1, new_b(b))
有没有办法使用包装器或其他东西来获取函数(add
/ minus
)和n
,以便每次我输入一些内容时add(1, 2)
它实际上都会执行add(1, 2 - 0.5)
而不是原始版本?
定义一个函数,该函数接受具有已知参数的现有函数,并返回一个包装它的新函数:
然后,您可以定义应用偏移量的
add
和的新版本:minus
或者,如果您希望能够制作一个适当的装饰器来将这种变异应用于只能通过应用偏移量来调用的新函数,则可以增加嵌套,以生成带有参数的装饰器,以便第一次调用采用偏移量并返回一个函数,当用另一个函数调用时,生成包装的函数:
你可以像以前一样使用它,但是顺序不同:
或者使用它作为装饰器来立即修改包装的函数:
因此
add
并且minus
立即存在,并且偏移量0.5
应用于所有调用(在这种情况下令人困惑,但在其他情况下很有用)。在@shadowRanger 的帮助下,我发现有两种方法可以编写包装器。
第一种方式:
因为我不必
@offset_b(0.5)
在函数定义之前使用,所以offset_b(n, func)
实际上可以采用func
。它可以节省一层包装。对于 print 函数,
offset_b(0.5, add)
给出修改后的 add 函数,然后我们可以传入(1,2)
第二种方法(与 ShadowRanger 共享的方法相同):
如果我们调用
offset_b(0.5)
,我们得到的实际上是包装函数。由于我们使用包装函数的方式是,func = wrapper(func)
我们需要做的是获取新函数,offset_b(0.5)(add)
然后我们将其提供(1,2)
给该函数,这样我们就得到了offset_b(0.5)(add)(1,2)