2012-08-09 26 views
5

Frecuentemente necesito verificar si una instancia de una clase tiene una propiedad y si esa propiedad existe, haga una comparación con su valor. ¿No hay forma de hacerlo además de lo siguiente?Comprobando la existencia y si existe, hay un cierto valor

if house.garage: 
    if house.garage == '3 car': 
     # do something with house.garage 

Respuesta

5

Puede "consolidar la expresión condicional", expuesto por Martin Fowler aquí: http://sourcemaking.com/refactoring/consolidate-conditional-expression#permalink-15

Esencialmente, cualquier sentencia if que contiene otra sentencia if dentro, es realmente sólo 1 if con una y en el medio!

if house.garage: 
    if house.garage == '3 car': 
     # do something with house.garage 

convierte

if house.garage and house.garage == '3 car': 
    # do something with house.garage 
6

En lugar de utilizar la notación de puntos, se puede hacer una llamada a getattr, que puede devolver un valor por defecto si el atributo mencionado no existe:

if getattr(house, 'garage', "") == '3 car': 
    # proceed 

Si house no tiene un atributo llamado 'garage', getattr solo necesita evaluar algo que no sea igual a '3 car'.

+2

Las personas no hacen la distinción entre "atributo no existe" y "atributo tiene un valor falsey", que es muy importante ya que las otras dos respuestas generarán excepciones si 'house.garage' no existe realmente como opuesto a simplemente ser Ninguno. – Jake

+0

Esta es una buena respuesta, pero el otro caso es más común para mí. Normalmente estoy buscando claves foráneas en un modelo django. Por lo tanto, el atributo siempre existe (es dotable) pero a veces es Ninguno y generará un error si intento acceder a uno de los atributos de los modelos relacionados. – freb

Cuestiones relacionadas