2010-02-27 2 views

ответ

31

Почему бы не сделать:

big(lite, (1, 2, 3)) 

?

Тогда вы можете сделать:

def big(func, args): 
    func(*args) 
+5

вы можете даже сделать 'большой (облегченный, 1, 2, 3) и' Защиту большой (Func, * арг): FUNC (* арг) ' –

+1

Это приятно, если вы можете (и хотите) изменить 'big', а' lite' имеет фиксированную подпись. Но часто один или оба являются внешними. В этом случае метод Тедди ('partial') гораздо более общий. – Mark

5
import functools 

#main 
big(functools.partial(lite, 1,2,3)) 
0

Не так, вы передаете в большой возвращаемого значения функции облегченной().

Вы должны сделать что-то вроде:

def lite(a, b, c): 
    return a + b + c 

def big(func, arg): 
    print func(arg[0], arg[1], arg[2]) 



big(lite, (1, 2, 3)) 
+0

Это то, что нужно для распаковки кортежей - см. Мой ответ. – Skilldrick

3

Аналогичная проблема обычно решается двумя способами:

  1. с лямбда ... но тогда пропущенный функция будет ожидать один аргумент, настолько большой() потребности которое должно быть изменено
  2. С именованными функциями, вызывающими исходные функции с аргументами. Обратите внимание, что такая функция может быть объявлена ​​внутри другой функции, а аргументы могут быть переменными.

Смотрите пример:

#!/usr/bin/python 

def lite(a,b,c): 
    return "%r,%r,%r" % (a,b,c) 

def big(func): # func = callable() 
    print func() 

def big2(func): # func = callable with one argument 
    print func("anything") 


def main(): 
    param1 = 1 
    param2 = 2 
    param3 = 3 

    big2(lambda x: lite(param1, param2, param3)) 

    def lite_with_params(): 
     return lite(param1,param2,param3) 

    big(lite_with_params) 

main() 
Смежные вопросы