La mia risposta è "nessuno dei due".
Credo che il modo più "Python" per fare le cose è NON controllare preventivamente se la chiave è in un dizionario e invece basta scrivere codice che presume che sia lì e prendere qualsiasi KeyErrors che si alza perché non lo era.
Questo è solitamente fatto con racchiudendo il codice in una clausola try...except
ed è un linguaggio ben noto di solito espressa come "è più facile chiedere perdono che il permesso" o con l'acronimo EAFP, che sostanzialmente significa che è meglio provare qualcosa e catturare gli errori invece per assicurarsi che tutto sia OK prima di fare qualsiasi cosa. Perché convalidare ciò che non ha bisogno di essere convalidato quando puoi gestire le eccezioni con grazia invece di cercare di evitarli? Perché è spesso più leggibile e il codice tende ad essere più veloce se la probabilità è bassa che la chiave non sarà lì (o qualunque precondizione ci possa essere).
Naturalmente, questo non è appropriato in tutte le situazioni e non tutti sono d'accordo con la filosofia, quindi dovrai decidere tu stesso caso per caso. Non sorprendentemente l'opposto di questo è chiamato LBYL per "Look Before You Leap".
Come esempio banale considerazione:
if 'name' in dct:
value = dct['name'] * 3
else:
logerror('"%s" not found in dictionary, using default' % name)
value = 42
vs
try:
value = dct['name'] * 3
except KeyError:
logerror('"%s" not found in dictionary, using default' % name)
value = 42
Anche se nel caso è quasi esattamente la stessa quantità di codice, il secondo non spendere tempo a controllare prima ed è probabilmente un po 'più veloce a causa di esso (prova ... tranne il blocco non è completamente gratuito, quindi probabilmente non fa molta differenza qui).
In generale, i test in anticipo possono spesso essere molto più coinvolti e il risparmio ottenuto dal non farlo può essere significativo. Detto questo, if 'name' in dict:
è migliore per i motivi indicati nelle altre risposte.
Se siete interessati al tema, questo message dal titolo "EAFP vs LBYL (era Re: Un po 'deluso finora)" dal Python archivio della mailing list probabilmente spiega la differenza tra i due è avvicinato meglio di me avere qui C'è anche una buona discussione sui due approcci nel libro Python in a Nutshell, 2 ° Ed di Alex Martelli nel capitolo sulle eccezioni intitolato "Error-Checking Strategies".
BTW, 'dict 'è il nome di un tipo Python integrato, quindi è meglio evitare di usarlo come nome variabile negli script (anche se in senso stretto, è legale farlo). – martineau
[i documenti sono abbastanza chiari] (http://docs.python.org/library/stdtypes.html#dict.has_key), no? – SilentGhost
In Python 3, gli oggetti 'dict' non hanno più un metodo' has_key() ', quindi version-portability-wise, l'operatore' in' è migliore. – martineau