2011-08-29 15 views
6

Hay varias maneras diferentes para comprobar si un diccionario de Python contiene una clave específica, es decir,comprobar un diccionario de Python para teclas específicas

d = {} 

if key in d: 

if d.contains(key): 

if d.has_key(key): 

que es tonto para un idioma para que pueda hacer lo mismo de diferentes maneras , A MENOS QUE cada uno de los métodos estaba haciendo algo completamente diferente. ¿Podría alguien por favor contrastar las tres técnicas anteriores, cómo son diferentes?

+0

d.contains nunca vistos(), es que las nuevas? – steabert

+7

@steabert: probablemente debería ser '__contains__' – Gerrat

+0

ah, gracias, no pensé en eso, tiendo a permanecer alejado de aquellos :) – steabert

Respuesta

5

d.__contains__(key) es lo que se utilizó key in d (ya in operador llama __contains__ método del diccionario)

has_key es obsoleto y hace lo mismo que __contains__

12

Son todos iguales y están por todas partes por razones históricas, pero usted should usekey in d.

+0

No creo que '__contains__' esté" cerca por razones históricas "? No es como que va a ser desaprobado en el corto plazo ... –

+0

¿Tal vez le gustaría dar más detalles para el beneficio del consultante? –

+0

Claro ... Agregué una respuesta. –

7

El método n. ° 1 es la forma aceptada de hacerlo. El Método n. ° 2 en realidad no existe, al menos en cualquier versión de Python de la que tenga conocimiento; Me interesaría ver dónde encontraste eso. El método n.º 3 solía ser el método aceptado, pero ahora es deprecated.

Así que realmente solo hay una forma.

+1

tal vez estaba pensando en '__contains__' – Gerrat

+4

Solo para atragantarse con esta respuesta ... si él * estaba * pensando en' __contains__' - la respuesta es que es un método especial usado para implementar 'b in a' ... el vm traduce cualquier referencia 'b in a' en una llamada a' a .__ contains __ (b) 'detrás de las escenas, al igual que' a [b] 'se traduce a' a .__ getitem __ (b) '. Los métodos especiales '__xxx__' son cómo Python proporciona una implementación limpia basada en métodos de todo el azúcar sintáctico que el lenguaje ofrece públicamente. –

4
  • key in d es la forma aceptada para hacerlo .

  • __contains__ es el atributo "mágico" (ref) que implementa la sintaxis anterior. La mayoría, si no todos, la sintaxis especial se implementa a través de dichos métodos. Por ejemplo, la declaración with se implementa a través de __enter__ y __exit__. Dichos métodos existen para permitir que se proporcione una funcionalidad especial para las clases definidas por el usuario.

  • el método has_key ya no existe en Python 3 y está en desuso en Python 2.

+0

Notando que Python realmente no tiene métodos privados ... – NullUserException

+0

@NullUserException: Gracias, busqué el nombre correcto para ello. –

Cuestiones relacionadas