Ma réponse est "ni un". Je crois que la façon la plus "pythonique" de faire est de NE PAS vérifier au préalable si la clé est dans un dictionnaire et d'écrire simplement du code supposant qu'elle existe et d'attraper les KeyErrors levées parce que ce n'était pas le cas.
Cela se fait habituellement avec renfermant le code dans une clause try...except
et est un langage bien connu généralement exprimé en « Il est plus facile de demander pardon que la permission » ou avec l'acronyme EAFP, ce qui signifie essentiellement est Il vaut mieux essayer quelque chose et attraper les erreurs au lieu de s'assurer que tout va bien avant de faire quoi que ce soit. Pourquoi valider ce qui n'a pas besoin d'être validé lorsque vous pouvez gérer les exceptions avec élégance au lieu d'essayer de les éviter? Parce que c'est souvent plus lisible et que le code a tendance à être plus rapide si la probabilité est faible que la clé ne sera pas là (ou quelles que soient les conditions préalables).
Bien sûr, ce n'est pas approprié dans toutes les situations et tout le monde n'est pas d'accord avec la philosophie, vous devrez donc décider pour vous-même au cas par cas. Il n'est pas étonnant que le contraire soit appelé LBYL pour "Look Before You Leap".
Par exemple trivial considérer:
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
Bien que dans le cas où il est presque exactement la même quantité de code, le second ne passe pas le temps de vérifier d'abord et probablement légèrement plus rapide à cause de ça (essayez ... sauf que le bloc n'est pas totalement gratuit, donc ça ne fait probablement pas tellement de différence ici). D'une manière générale, les tests préalables peuvent souvent être beaucoup plus impliqués et les économies réalisées en ne le faisant pas peuvent être importantes. Cela dit, if 'name' in dict:
est mieux pour les raisons indiquées dans les autres réponses.
Si vous êtes intéressé par le sujet, ce message intitulé « EAFP vs LBYL (a Re: Un peu déçu jusqu'à présent) » de l'archive de la liste de diffusion Python explique probablement la différence entre les deux approché mieux que moi avoir ici. Il ya aussi une bonne discussion sur les deux approches dans le livre Python in a Nutshell, 2e Ed par Alex Martelli dans le chapitre sur les exceptions intitulé "Error-Checking Strategies".
BTW, 'dict 'est le nom d'un type Python intégré, il est donc préférable de ne pas l'utiliser en tant que nom de la variable dans vos scripts (bien que ce soit strictement légal, il est légal de le faire). – martineau
[les docs sont assez clairs] (http://docs.python.org/library/stdtypes.html#dict.has_key), non? – SilentGhost
En Python 3, les objets 'dict' n'ont plus de méthode' has_key() ', donc la portabilité de la version est meilleure. – martineau