2010-02-27 9 views

Répondre

31

Pourquoi ne pas faire:

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

?

Ensuite, vous pouvez faire:

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

vous pouvez même faire 'grande (lite, 1, 2, 3)' et 'def grande (Func, * args): func (* args)' –

+1

C'est bien si vous pouvez (et voulez) changer 'big', et' lite' a une signature fixe. Mais souvent, un ou les deux sont externes. Dans ce cas, la méthode de Teddy («partial») est beaucoup plus générale. – Mark

5
import functools 

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

pas de cette façon, vous passez à grande la valeur de retour de la fonction lite().

Vous devriez faire quelque chose comme:

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

C'est ce que le déballage de tuple est pour - voir ma réponse. – Skilldrick

3

problème similaire est généralement résolu de deux manières:

  1. Avec lambda ... mais la fonction passée s'attendra un argument, les besoins si grand() à modifier
  2. Avec des fonctions nommées appelant les fonctions d'origine avec des arguments. Veuillez noter que cette fonction peut être déclarée à l'intérieur d'une autre fonction et que les arguments peuvent être des variables.

Voir l'exemple:

#!/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() 
Questions connexes