Supponiamo che abbia una funzione get_data
che richiede un numero di argomenti parola chiave. C'è qualche modo io possa fare questoUtilizzare ** kwargs sia nella chiamata che nella definizione della funzione
def get_data(arg1, **kwargs):
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, **data)
Così l'idea è quella di evitare di digitare i nomi degli argomenti sia in funzione di chiamata e la definizione di funzione. Chiaro la funzione con un dizionario come argomento e le chiavi del dizionario diventano variabili locali della funzione e i loro valori sono i valori del dizionario
Ho provato quanto sopra e ho ricevuto errore dicendo global name 'arg2' is not defined
. Comprendo che posso modificare locals()
nella definizione di get_data
per ottenere il comportamento desiderato.
Quindi il mio codice sarebbe simile a questa
def get_data(arg1, kwargs):
locals().update(kwargs)
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, data)
e che non avrebbe funzionato troppo. Inoltre non posso ottenere il comportamento senza utilizzare locals()
?
io suggerisco di controllare questa domanda http://stackoverflow.com/questions/3394835/args-and-kwargs –
Non modificare 'locals' , non è nemmeno garantito di lavorare tutto il tempo: http://docs.python.org/2/library/functions.html#locals – jamylak
.. perché dovresti farlo anche tu? Se conosci arg2, arg3, arg4 sono sempre per passare, quindi dovresti specificarli come argomenti singoli. Se non lo fai, anche se hai il comportamento desiderato, non appena hai fatto riferimento diciamo 'arg4' quando' data' non ha definito 'arg4', avrebbe sollevato un NameError, non avrebbe nemmeno stampato alcun dato, avrebbe solo generato un errore. – kampu