2010-07-03 7 views
5

Estoy ejecutando una pequeña aplicación en Google App Engine con Python. En el modelo, tengo una propiedad de tipo DateTimeProperty, que es datetime.datetime. Cuando se crea, no hay ningún valor (es decir, "Ninguno"). Quiero comparar si ese datetime.datetime es None, pero no puedo.Comparando si datetime.datetime existe o None

if object.updated_date is None or object.updated_date >= past: 
    object.updated_date = now 

Tanto updated_date y past es datetime.datetime.

Recibo el siguiente error.

TypeError: can't compare datetime.datetime to NoneType

¿Cuál es la forma correcta de hacerlo?

+0

No hay forma de que pueda obtener ese error en esa línea si ambas son instancias de 'datetime.datetime'. –

Respuesta

3

Quiere and, no or.

Es posible que también desee utilizar is None.

EDIT:

Puesto que haya determinado que no es object.updated_dateNone, esta única otra posibilidad es que past es None.

5

Quizás quiso decir:

if object.updated_date and object.updated_date >= past: 

Si se trata de Truthy (que implica no nula), comprobamos que es también > = pasado. Esto utiliza la evaluación de cortocircuito, lo que significa que la segunda condición no se verifica si la primera es falsa.

+0

No verifica la nulidad, verifica la falsedad. Esto capturará' None', pero también capturará algunos valores que no son '' Nones'. –

+0

True , @ Ignacio. Ya lo he aclarado. –

4

Dado que la discusión anterior parece haber establecido que cualquiera de las variables podría ser None, un enfoque sería (suponiendo que desea establecer object.updated_date cuando alguna de las variables es None):

if None in (past, object.updated_date) or object.updated_date >= past: 
    object.updated_date = now 

punto siendo que el cheque None in (past, object.updated_date) puede ser más útil que la alternativa semánticamente equivalente (past is None or object.update_date is None) (podría decirse que es un épsilon más legible gracias a su mejor compacidad, pero es, por supuesto, una cuestión de estilo argumentable).

Como un aparte, y una cuestión de estilo menos discutible ;-), recomiendo enfáticamente que no se usen nombres incorporados como nombres para sus propias variables (y funciones, etc.) - object es una construcción en nombre que en este contexto se está utilizando claramente para sus propios fines. Usar obj en su lugar es más conciso, aún legible (podría decirse que más ;-), y no tiene inconvenientes. Es poco probable que seas "mordido" en un caso dado por la práctica dudosa de "sombrear" nombres incorporados con el tuyo, pero finalmente sucederá (ya que necesitas el significado normal del nombre oculto durante algún tiempo). operación de mantenimiento ordinario posterior) y es posible que se encuentre en una situación de depuración confusa; mientras tanto, corre el riesgo de confundir a otros lectores/mantenedores ... y no obtiene absolutamente ninguna ventaja a cambio de estas desventajas.

que se dan cuenta de que muchos de los nombres de Python construidos-ins' son una "molestia atractiva" en este sentido ... file, object, list, dict, set, min, max ...todo el nombre aparentemente atractivo para "un archivo", "un objeto", "una lista", etc. ¡Pero, vale la pena aprender a resistir esta tentación particular! -)

Cuestiones relacionadas