2014-10-23 10 views
6

Da python doc e stackoverflow, capisco come utilizzare i ** kwargs nella mia funzione def. Tuttavia, ho un caso che richiede due set di ** kwarg per due funzioni secondarie. Qualcuno può mostrarmi come separare correttamente i ** kwarg?python passa diversi ** kwargs a più funzioni

Qui è il mio obiettivo: Per tracciare un insieme di punti e interpolati curva regolare,
e il mio codice di esempio ingenua:

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 

Grazie per l'aiuto.

+3

Basta passare 'scatter' e' plot' come normale 'dict's? Sembra che siano necessari argomenti ... quindi usa '** scatter' o' ** plot' nelle funzioni ... non stai facendo nient'altro con loro –

risposta

6

Non esiste un tale meccanismo. Esiste una proposta, PEP-448, in base alla quale Python 3.5 e il successivo generalize argument unpacking. Python 3.4 e precedenti non lo supportano. Meglio che si può fare in generale:

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 

poi passano in queste opzioni come dizionari, non kwargs, a smoothy.

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

Poiché i nomi delle variabili sarebbero poi eventualmente esposti a chiamanti, si consiglia di rinominarle qualcosa di più breve (forse scatter_options e plot_options).

Aggiornamento: Python 3.5 e 3.6 sono ora mainstream e supportano effettivamente una sintassi di decompressione estesa basata su PEP-448.

>>> d = {'name': 'joe'} 
>>> e = {'age': 20} 
>>> { **d, **e } 
{'name': 'joe', 'age': 20} 

Tuttavia, questo non aiuta molto in questo scenario kwargs destinato a destinazioni multiple. Anche se la funzione smoothy() prendesse un sacchetto di kwargs unificato, avresti bisogno di determinare quale di essi fosse destinato a quali subfunzioni. Disordinato al meglio. Più parametri dict, uno destinato a essere passato a ogni sottofunzione kwarg-take, rimane l'approccio migliore.

+0

Come ho suggerito [qui] (http: // stackoverflow.com/questions/26534134/python-pass-different-kwargs-to-multiple-functions#comment41694378_26534134) nessun punto mantiene davvero il 'kwargs_for_' negli argomenti più ... (imho comunque) –

+0

@JonClements Sembra che noi ha avuto una condizione di competizione/editing simultaneo, ma è giunto alla stessa conclusione! –

+1

Nessun problema ... risposta perfettamente buona (anche se sono di parte * cough *) ... Non ero sicuro se fosse così semplice o se fosse necessario qualcosa di più contorto. +1 da parte mia per ortografia e opzioni :) –