2010-07-06 21 views
49

Tengo una serie de funciones con una combinación de argumentos posicionales y de palabras clave, y me gustaría vincular uno de sus argumentos a un valor dado (que se conoce solo después de la definición de la función). ¿Hay una manera general de hacer eso?¿Cómo vincular argumentos a valores dados en funciones de Python?

Mi primer intento fue:

def f(a,b,c): print a,b,c 

def _bind(f, a): return lambda b,c: f(a,b,c) 

bound_f = bind(f, 1) 

Sin embargo, para esto necesito saber los argumentos exactos pasaron a f, y no puede usar una sola función para unir todas las funciones que me interesan (ya que tener diferentes listas de argumentos).

Respuesta

74
>>> from functools import partial 
>>> def f(a, b, c): 
... print a, b, c 
... 
>>> bound_f = partial(f, 1) 
>>> bound_f(2, 3) 
1 2 3 
13

Probablemente desee la función partial de functools.

6

Como sugiere MATTH de answer, functools.partial es el camino a seguir.

Sin embargo, su pregunta se puede leer como "cómo puedo implementar partial". Lo que su código no se encuentra es el uso de *args, **kwargs - 2 tales usos, en realidad:

def partial(f, *args, **kwargs): 
    def wrapped(*args2, **kwargs2): 
     return f(*args, *args2, **kwargs, **kwargs2) 
    return wrapped 
0

Usted puede utilizar partial y update_wrapper de obligar argumentos para valores dados y preservar__name__ y __doc__ de la función original:

from functools import partial, update_wrapper 


def f(a, b, c): 
    print(a, b, c) 


bound_f = update_wrapper(partial(f, 1000), f) 

# This will print 'f' 
print(bound_f.__name__) 

# This will print 1000, 4, 5 
bound_f(4, 5) 
Cuestiones relacionadas