2016-05-23 11 views
2

Ich habe das Gefühl, dass diese Frage schon einmal gestellt wurde, aber ich habe es nicht gefunden, tut mir leid, wenn das der Fall ist!Wie man über verschiedene Kwarts iteriert?

Ich habe eine Funktion mit verschiedenen Argumenten wie:

def f(arg1, arg2, ...,argN, kw1=0, kw2=0, kw3=0): 
    # some code ... 

vorausgesetzt, ich meine (obligatorisch) haben Argumente definiert:

arg1 = some_value_1 
arg2 = some_value_2 
... 
argN = some_value_N 

ich einige sich wiederholende Funktion verdichten wollen ruft wie

f(arg1, arg2, ... argN, kw1=1) 
f(arg1, arg2, ... argN, kw1=23) 
f(arg1, arg2, ... argN, kw2=456) 
f(arg1, arg2, ... argN, kw2=789) 
f(arg1, arg2, ... argN, kw3='a') 
f(arg1, arg2, ... argN, kw3='b') 
... 

in etwas, das wie folgt aussieht:

for kw_def in [kw1=1, kw1=23, kw2=456, kw2=789, kw3='a', kw3='b',...]: 
    f(arg1, arg2, ... argN, kw_def) 

aber syntaktisch korrekt. Was ist die richtige pythonische Art, das zu tun?

Antwort

6

Verwenden Wörterbücher:

for kw_def in [ 
    {'kw1': 1}, 
    {'kw1': 23}, 
    {'kw2': 456}, 
]: 
    f(arg1, ..., argN, **kw_def) 
2

Verwendung partial functions.

Vorausgesetzt, dass Sie eine Funktion mit dieser Signatur haben:

def f(arg1, arg2, arg3, kw1, kw2, kw3): 
    pass 

Sie können Anrufe verkürzen, die für arg1 gemeinsame Werte haben, arg2, kw1 und kw2 wie folgt aus:

from functools import partial 
f_short = partial(f, 1, 2, kw1="A", kw2="B") 
f_short(3, kw3="C") 

Dieser Aufruf von f_short wäre gleich dem direkten Anruf unten:

f(1, 2, 3, kw1="A", kw2="B", kw3="C")