2012-12-10 14 views
5

Gli argomenti predefiniti del modulo x={} in genere non raggiungono lo scopo previsto in Python, poiché gli argomenti predefiniti sono associati quando una funzione è definita, non chiamata.Qual è il modo più pitone di usare un dizionario vuoto come argomento predefinito?

La convenzione sembra essere quella di impostare gli oggetti mutabili come argomenti predefiniti con x=None e quindi controllare x is None per assegnare il valore predefinito corretto quando viene chiamata la funzione.

Quindi, se mi piacerebbe lanciare x a un dizionario che è per default vuota, vorrei utilizzare qualcosa come il seguente:

def f(x=None): 
    x = dict(x) if x is not None else {} 

Tuttavia, poiché dict può assumere qualsiasi iterabile, potrei anche scrivere questo versione più succinta:

def f(x=()): 
    x = dict(x) 

Quale di questi è l'approccio "giusto"?

risposta

6

Il idiomatica Lo stile corrisponde a non cast a dict; in questo modo qualcuno potrebbe utilizzare qualsiasi oggetto che implementa i metodi di mapping corretti.

Così, il metodo più divinatorio è quello di utilizzare:

def f(x=None): 
    if x is None: 
     x = {} 

e poi basta usare metodi di mappatura.

Quindi, in genere non si dovrebbero trasmettere argomenti a un dettato. Si specifica l'API accetta invece un oggetto di mapping e si aspettano che i chiamanti eseguano il casting.

L'unico motivo per accettare sia un dict sia un iterabile è quando si desidera supportare coppie di valori-chiave ordinate in cui sono consentite chiavi duplicate, ad esempio per lo urllib.urlencode function. In tal caso, un dict non può conservare quell'informazione, e quel metodo non lancia l'iterabile a un dict, ma piuttosto usa il dict come iterabile.

1

Non c'è una risposta giusta o sbagliata qui, ma direi che il primo è più idiomatica (che non fa il secondo sbagliato, o cattivo, o peggio, etc.)

Problemi correlati