2014-10-23 6 views
6

Von python doc und stackoverflow verstehe ich, wie man die ** kwargs in meiner Def-Funktion verwendet. Allerdings habe ich einen Fall benötigt zwei Sätze von ** kwargs für zwei Unterfunktionen. Kann mir jemand zeigen wie man die Kwargs richtig trennt?Python pass unterschiedlich ** kwargs zu mehreren Funktionen

Hier ist mein Ziel: Reihe von Punkten plotten und interpoliert glatte Kurve,
und mein naiver Beispielcode:

def smoothy(x,y, kind='cubic', order = 3, **kwargs_for_scatter, **kwargs_for_plot): 
    yn_cor = interp1d(x, y, kind=kind, assume_sorted = False) 
    xn = np.linspace(np.min(x), np.max(x), len(x) * order) 
    plt.scatter(x,y, **kwargs_for_scatter) 
    plt.plot(xn, yn_cor(xn), **kwargs_for_plot); 
    return 

Vielen Dank für Hilfe.

+3

Pass einfach 'scatter' und' plot' als normal 'dict's? Es scheint, dass sie erforderliche Argumente sind ... dann benutze '** scatter' oder' ** plot' in den Funktionen ... du machst nichts anderes mit ihnen –

Antwort

6

Es gibt keinen solchen Mechanismus. Es gibt einen Vorschlag, PEP-448, wobei Python 3.5 und folgende das Entpacken verallgemeinern. Python 3.4 und vorherige unterstützen es nicht. Beste, was Sie können in der Regel tun:

def smoothy(x,y, kind='cubic', order = 3, kwargs_for_scatter={}, kwargs_for_plot={}): 
    yn_cor = interp1d(x, y, kind=kind, assume_sorted = False) 
    xn = np.linspace(np.min(x), np.max(x), len(x) * order) 
    plt.scatter(x,y, **kwargs_for_scatter) 
    plt.plot(xn, yn_cor(xn), **kwargs_for_plot); 
    return 

passieren dann in diesen Optionen wie Wörterbücher, nicht kwargs, zu smoothy.

smoothy(x, y, 'cubic', 3, {...}, {...}) 

Da die Variablennamen würde dann möglicherweise für den Anrufer ausgesetzt werden, Sie können sie etwas kürzer (vielleicht scatter_options und plot_options) umzubenennen.

Update: Python 3.5 und 3.6 sind jetzt Mainstream und sie unterstützen tatsächlich eine erweiterte Entpackungssyntax basierend auf PEP-448.

Dies hilft jedoch nicht viel in diesem Szenario Kwargs-für-mehrere-Destinationen beabsichtigt. Selbst wenn die smoothy()-Funktion eine vereinigte Kwarge-Tasche mit sich tragen würde, müssten Sie herausfinden, welche davon für welche Unterfunktionen gedacht waren. Chaotisch vom Allerfeinsten. Mehrere dict Parameter, von denen einer an jede Kwarg-Unterfunktion übergeben werden soll, sind immer noch der beste Ansatz.

+0

Wie ich vorgeschlagen habe [hier] (http: // stackoverflow.com/questions/26534134/python-pass-different-kwargs-to-multiple-functions#comment41694378_26534134) kein Punkt wirklich halten die 'kwargs_for_' in den Argumenten nicht mehr ... (imho sowieso) –

+0

@JonClements Sieht aus wie wir hatte eine Race-Condition/gleichzeitige Bearbeitung, kam aber zur selben Schlussfolgerung! –

+1

Keine Sorge ... vollkommen gute Antwort (obwohl ich voreingenommen bin * hust *) ... Ich war mir nur nicht sicher, ob es so einfach war oder ob etwas komplizierteres erforderlich war. +1 von mir für die Rechtschreibung und Optionen :) –