Можно ли частично изменить значение параметра? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу найти понятный и эффективный способ изменения значения параметра, установленного для 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(...)) 

, но тогда я 'Я хотел бы изменить некоторые параметры, приведенные частично.Я мог бы сделать новую часть снова, но это выглядит немного грязно.

1 Ответ

1 голос
/ 21 мая 2019

Если допустимо рассмотреть реализацию 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
...