我想使用functools.partial
将某个参数设置为常量,同时完全删除该参数。
让我用一个简单的例子来解释它。
from functools import partial
def f(a, b):
return a * b
g = partial(f, b=2)
但是,此函数g
仍然具有以下调用签名:
g?
Signature: g(a, *, b=1)
Call signature: g(*args, **kwargs)
Type: partial
String form: functools.partial(<function f at 0x7ff7045289d8>, b=1)
File: /opt/conda/envs/dev/lib/python3.6/functools.py
Docstring:
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.
我当然可以使用 lambda 函数来做到这一点,例如:
def f(a, b):
return a * b
g = lambda a: f(a, b=2)
具有正确的调用签名:
g?
Signature: g(a)
Docstring: <no docstring>
File: ~/Work/<ipython-input-7-fc5f3f492590>
Type: function
使用lamdba
函数的缺点是我需要再次写下所有参数。在我的简单示例中,这无关紧要,但看看这个:
phase_func = lambda site1, site2, B_x, B_y, B_z, orbital, e, hbar: \
phase_func(site1, site2, B_x, B_y, B_z, orbital, e, hbar, xyz_offset=(0,0,0))
# or this
phase_func = partial(phase_func, xyz_offset=(0,0,0)
为什么我还要这个?
稍后在我的代码中,我使用了可以通过将其他两个函数相乘来生成新函数的包装器,例如combine(function1, function2, operator.mul)
. 此combine
函数查看所有参数,因此我需要在设置后删除参数。