简体   繁体   中英

Is it possible to change parameter value in partial?

I want to find a clear and efficient way to be able to change parameter value set for functools.partial .

Let's see a simple example:

from functools import partial

def fn(a,b,c,d,e):
   print(a,b,c,d,e)

fn12 = partial(fn, 1,2)

Later, I want to have something like:

fn12 [0] = 7 

to replace the value on specific place without create a new partial, because it's pretty heavy code there.

Addition: i ask about general possibility to change partial value.

The naive example would be like :

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) 

I need that for example for widgets, where action function is defined like :

  rb.config(command = partial(...)) 

but then I'd like to change some parameters given in partial. I could do a new partial again but that looks kinda messy.

If it is permissible to look into the implementation of partial , then using __reduce__ and __setstate__ you can replace the args wholesale:

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')

Output:

1 2 c d e
7 2 c d e

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM