Mi respuesta es "ninguno".
Creo que la forma más "pitonica" de hacer las cosas es NO verificar de antemano si la clave está en un diccionario y en su lugar solo escribir código que asume que está allí y atrapar cualquier KeyErrors que se active porque no fue así.
Esto se hace generalmente con el que encierra el código en una cláusula try...except
y es un lenguaje conocido generalmente se expresa como "Es más fácil pedir perdón que permiso" o con las siglas EAFP, lo que básicamente significa que es mejor intentar algo y detectar los errores en su lugar para asegurarse de que todo esté bien antes de hacer cualquier cosa. ¿Por qué validar lo que no necesita ser validado cuando puede manejar las excepciones correctamente en lugar de tratar de evitarlas? Porque a menudo es más legible y el código tiende a ser más rápido si la probabilidad es baja de que la clave no esté allí (o las condiciones previas que pueda haber).
Por supuesto, esto no es apropiado en todas las situaciones y no todos están de acuerdo con la filosofía, por lo que tendrá que decidir por sí mismo caso por caso. No es sorprendente que lo contrario de esto se llama LBYL para "Look Before You Leap".
Como un ejemplo trivial tener en cuenta:
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
Aunque en el caso que es casi exactamente la misma cantidad de código, la segunda no pasa tiempo comprobando primero y es, probablemente, un poco más rápido por eso (intente ... excepto que el bloqueo no es totalmente gratis, por lo que probablemente no haga mucha diferencia aquí).
En general, las pruebas con anticipación a menudo pueden ser mucho más complicadas y el ahorro de no hacerlo puede ser significativo. Dicho esto, if 'name' in dict:
es mejor por las razones indicadas en las otras respuestas.
Si usted está interesado en el tema, esta message titulado "EAFP vs LBYL (fue re: Un poco decepcionado hasta ahora)" del archivo de la lista de Python probablemente explica la diferencia entre los dos se acercó mejor que yo tener aquí. También hay una buena discusión sobre los dos enfoques en el libro Python in a Nutshell, 2nd Ed de Alex Martelli en el capítulo sobre excepciones titulado "Error-Checking Strategies".
Por cierto, 'dict 'es el nombre de un tipo de Python incorporado así que es mejor evitar usarlo como nombre de variable en sus scripts (aunque estrictamente hablando, es legal hacerlo). – martineau
[los documentos están bastante claros] (http://docs.python.org/library/stdtypes.html#dict.has_key), ¿no? – SilentGhost
En Python 3, los objetos 'dict' ya no tienen el método' has_key() ', por lo que el operador' in' es mejor. – martineau