2015-10-10 3 views
0

Я пытаюсь получить мою голову вокруг этого фрагмента:питона: understaning частичные функции

def a_func(a, b, c): 
    print "a: %s\nb: %s\nc: %s" %(a, b, c) 

def partial(fn, *args): 
    print "Args in partial : %s" %str(args)  
    def fn_part(*fn_args): 
    print "fn_args in fn_part : %s" %fn_args 
    return fn(*args+fn_args)  
    return fn_part 

print_fn = partial(a_func, 'A', 'B')  
print_fn('C') 

Выход:

Args in partial : ('A', 'B') 
fn_args in fn_part : C 
a: A 
b: B 
c: C 

Как течёт здесь контроль?

объект функции print_fn указывает на fn_part, но также имеет некоторые переменные предопределенные (a и b). Как я могу просмотреть переменные, которые уже определены для функции?

+0

Не знаете, что вы просите. '* args' является кортежем уже определенных значений, которые передаются в' fn() ', когда вызывается' fn_part() '. Вы * уже * печатаете это. –

+0

'a_func' нуждается в трех переменных. Мы уже определили 'a' и' b'. Что, если я хочу изменить их? 'print_fn ('a2,' b2 ',' c ')' дает ошибку. –

+0

Вы не можете, не с этой настройкой; закрытие 'args' не может быть заменено. –

ответ

0

fn_part() функция доступа args как закрытие. Вы можете прочитать те из возвращаемого функционального объекта:

>>> print_fn = partial(a_func, 'A', 'B')  
Args in partial : ('A', 'B') 
>>> print_fn.__closure__ 
(<cell at 0x102a90be8: tuple object at 0x10075bf38>, <cell at 0x102a901d8: function object at 0x102aa1848>) 
>>> print_fn.__closure__[0].cell_contents 
('A', 'B') 

Вы не можете изменить закрытие; вместо этого вы создадите объект partial() или просто вызовите исходную функцию напрямую.

Смежные вопросы