2010-02-27 17 views

Respuesta

31

Por qué no hacer:

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

?

entonces usted puede hacer:

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

incluso se puede hacer 'grande (lite, 1, 2, 3)' y 'def grande (func, * args): func (* args)' –

+1

Eso es bueno si puedes (y quieres) cambiar 'big', y' lite' tiene una firma fija. Pero a menudo uno o ambos son externos. En ese caso, el método de Teddy ('partial') es mucho más general. – Mark

5
import functools 

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

esta manera, estás pasando a grandes el valor de retorno de la función Lite().

Usted debe hacer algo como:

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

Esto es para lo que es el desempaquetado de tuplas - ver mi respuesta. – Skilldrick

3

problema similar se suele resolver de dos maneras:

  1. Con lambda ... pero entonces la función pasada esperarán un argumento, tan grande() necesidades para ser cambiado
  2. Con funciones nombradas llamando a las funciones originales con argumentos. Tenga en cuenta que dicha función puede declararse dentro de otra función y los argumentos pueden ser variables.

Véase el ejemplo:

#!/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() 
Cuestiones relacionadas