2010-07-06 4 views
49

Ich habe eine Reihe von Funktionen mit einer Kombination aus Positions- und Schlüsselwortargumenten, und ich möchte eines ihrer Argumente an einen bestimmten Wert (der nur nach der Funktionsdefinition bekannt ist) binden. Gibt es eine allgemeine Vorgehensweise?Wie binden Sie Argumente an gegebene Werte in Python-Funktionen?

Mein erster Versuch war:

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) 

jedoch dafür ich die genaue args zu f weitergegeben wissen muß, und nicht eine einzelne Funktion verwenden, um alle Funktionen zu binden, ich bin interessiert an (da sie verschiedene Argumentlisten haben).

Antwort

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

Wahrscheinlich möchten Sie die Funktion partial von functools.

6

Wie answer von Matth vorgeschlagenen, functools.partial ist der Weg zu gehen.

Ihre Frage kann jedoch als "Wie kann ich partial implementieren" gelesen werden. Was Ihr Code fehlt, ist die Verwendung von *args, **kwargs-2 solche Verwendungen, tatsächlich:

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

Sie partial und update_wrapper können Argumente angegebenen Werte zu binden und bewahren__name__ und __doc__ der ursprünglichen Funktion:

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) 
Verwandte Themen