我想找到一种清晰有效的方法来更改为functools.partial
设置的参数值。
让我们看一个简单的例子:
from functools import partial
def fn(a,b,c,d,e):
print(a,b,c,d,e)
fn12 = partial(fn, 1,2)
稍后,我想要类似的东西
fn12 [0] = 7
替换特定位置上的值而无需创建新的局部变量,因为那里的代码非常繁琐。
加法:我询问改变部分价值的一般可能性。
简单的例子是:
def printme( a,b,c,d,e):
print(a,b,c,d,e)
class my_partial:
def __init__(self, fn, *args):
self.__func__ = fn
self. args = list(args)
def __call__(self, *next_args):
call = self. args + list(next_args)
return self. __func__(* (call) )
fn12 = my_partial(printme,1,2)
fn12(3,4,5)
fn12.args[1] = 7
fn12(3,4,5)
例如,对于需要定义动作功能的小部件,我需要这样:
rb.config(command = partial(...))
但是我想更改部分给出的一些参数。我可以再次做一个新的局部,但看起来有点混乱。
答案 0 :(得分:1)
如果允许查看partial
的实现,那么可以使用__reduce__
和__setstate__
来代替args
批发:
from functools import partial
def fn(a,b,c,d,e):
print(a,b,c,d,e)
fn12 = partial(fn, 1,2)
def replace_args(part, new_args):
_,_, f = part.__reduce__()
f, _, k, n = f
part.__setstate__( (f, new_args, k, n) )
fn12('c','d','e')
replace_args(fn12, (7,2))
fn12('c','d','e')
输出:
1 2 c d e
7 2 c d e
答案 1 :(得分:0)
您可以更新部分参数。例如,如果您有这样的函数:
def f(a, b):
return a*b
func = partial(f, b=2)
func(1) # result: 1*2=2
现在,您可以像这样更新部分参数 b:
func(1, b=7) # result: 1*7=7