In termini generali (non necessariamente Python), tendo a preferire il metodo di "prova-poi-tell-me-se-da-andato-sbagliato" (eccezioni) in tutti, ma i casi più semplici. Questo perché, negli ambienti con thread o durante l'accesso al database, i dati sottostanti possono cambiare tra il controllo della chiave e l'estrazione del valore.
Se non si modifica l'array associativo al di fuori del thread corrente, è possibile eseguire il metodo "check-first-then-extract".
Ma questo è per il caso generale. Qui, in particolare, è possibile utilizzare il metodo get
che consente di specificare un valore predefinito se la chiave non esiste:
return d.get (c, "N/A")
te lo chiarire ciò che ho detto nel primo paragrafo.In situazioni in cui i dati sottostanti possono cambiare tra il controllo e l'utilizzo, è necessario sempre utilizzare un'operazione di tipo eccezione (a meno che non si disponga di un'operazione che non causerà un problema, ad esempio d.get()
, menzionato sopra). Si consideri ad esempio, i seguenti due filo linee temporali:
+------------------------------+--------------------+
| Thread1 | Thread2 |
+------------------------------+--------------------+
| Check is NY exists as a key. | |
| | Delete NY key/val. |
| Extract value for NY. | |
+------------------------------+--------------------+
Quando il filo 1 tenta di estrarre il valore, si otterrà un'eccezione comunque, quindi si può anche solo codice per la possibilità e rimuovere il controllo iniziale.
Il commento sui database è anche rilevante poiché questa è un'altra situazione in cui i dati sottostanti possono cambiare. Ecco perché tendo a preferire l'SQL atomico (ove possibile) piuttosto che qualcosa come ottenere una lista di chiavi e poi elaborarle con dichiarazioni individuali.
eccetto: è cattivo karma. Sii sempre specifico su ciò che ti interessa catturare, in questo caso KeyError – richo
Hai scelto un esempio scarso. La risposta ovvia non coinvolge nessuno stile. – Omnifarious