user8426627
user8426627

Reputation: 943

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.

Upvotes: 3

Views: 2565

Answers (2)

Sara
Sara

Reputation: 537

You can update partial parameters. For example if you have a function like this:

def f(a, b):
    return a*b
func = partial(f, b=2)
func(1) #  result: 1*2=2

Now, you can update partial parameter b like this:

func(1, b=7) # result: 1*7=7

Upvotes: 4

quamrana
quamrana

Reputation: 39404

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

Upvotes: 3

Related Questions