是否可以部分更改参数值?

时间:2019-05-21 15:30:48

标签: python parameters partial

我想找到一种清晰有效的方法来更改为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(...)) 

但是我想更改部分给出的一些参数。我可以再次做一个新的局部,但看起来有点混乱。

2 个答案:

答案 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