2012-02-14 10 views
26

In Python qual è il modo più efficace per fare questo:Access e restituisce None se non esiste

my_var = some_var['my_key'] | None 

es. assegnare some_var['my_key'] a my_var se some_var contiene 'my_key', altrimenti fare my_var essere None.

+1

Cosa intendi con "se esiste"? Il nome 'some_var' potrebbe non essere definito in alcuni casi? –

+1

L'ho appena modificato - per chiarire - sto cercando di verificare l'esistenza di una chiave in un dizionario essenzialmente –

+0

Scommetto che questo è già stato chiesto ... –

risposta

37

Python lancerà una KeyError se la chiave non esiste nel dizionario, quindi non è possibile scrivere il codice nello stesso modo del tuo JavaScript. Tuttavia, se stai operando specificamente con dicts come nel tuo esempio, c'è una bella funzione mydict.get('key', default) che tenta di ottenere la chiave dal dizionario e restituisce il valore predefinito se la chiave non esiste.

Se si desidera che il valore predefinito sia None non è necessario passare esplicitamente il secondo argomento.

A seconda di ciò che contiene il dettato e della frequenza con cui si prevede di accedere alle chiavi non impostate, è inoltre possibile che si desideri utilizzare lo defaultdict dal pacchetto collections. Questo prende una fabbrica e la usa per restituire nuovi valori dal metodo magico __missing__ ogni volta che si accede a una chiave che non è stata altrimenti impostata in modo esplicito. È particolarmente utile se ci si aspetta che il tuo dict contenga un solo tipo.

from collections import defaultdict 

foo = defaultdict(list) 
bar = foo["unset"] 
# bar is now a new empty list 

N.B. i documenti (per 2.7.13) affermano che se non si passa un argomento a defaultdict verrà restituito None per le chiavi non impostate. Quando l'ho provato (in 2.7.10, è proprio quello che mi è capitato di aver installato), che non ha funzionato e ho ricevuto uno KeyError. YMMV.In alternativa, puoi semplicemente usare una lambda: defaultdict(lambda: None)

+2

** KeyError ** è ciò che viene generato quando si accede a una chiave che non esiste nel dizionario. – farthVader

2
try: 
    my_var = some_var 
except: 
    my_var = None 

Ma onestamente questo probabilmente non arrivare al cuore di ciò che si sta cercando di fare ... abbiamo bisogno di più contesto per rispondere più pienamente.

+0

Ho appena aggiunto un chiarimento - some_var è in realtà un dizionario e voglio assicurarmi che la chiave esista in esso altrimenti usa Nessuno –

1

In python "|" viene tradotto in "o", in modo da:

my_var = some_var o Nessuno

Edit: Hai modificato il post iniziale. Il modo corretto per fare quello che vuoi è:

my_var = some_var.get('my_key', None) 
+0

Nessuno è inutile, il valore predefinito è Nessuno -> http : //docs.python.org/library/stdtypes.html#typesmapping – Fred

+0

È solo un esempio per illustrare l'uso di dict.get. –

17

Stai cercando il metodo di dictget().

my_var = some_var.get('some_key') 

Procedimento get() restituirà il valore associato a 'some_key', se esiste un valore. Se la chiave non è presente, verrà restituito None.

7

Supponendo some_var è un dizionario, è necessario dict.get():

my_var = some_var.get('my_key') 

Questo risultato default None se my_key è mancante, ma è in grado di fornire un valore predefinito diverso:

my_var = some_var.get('my_key', default) 
6

La cosa grandiosa del metodo .get() è che puoi effettivamente definire un valore da restituire nel caso in cui la chiave non esista.

my_dict = { 1: 'one', 2: 'two' } 
print my_dict.get(3, 'Undefined key') 

stampa.

Undefined key 

Questo è molto utile non solo a scopo di debug, ma anche durante l'analisi JSON (nella mia esperienza, almeno), e si dovrebbe preferisce usare get() sopra [] il più possibile.