Сравнение, если datetime.datetime существует или Ни один

Я запускаю небольшое приложение на Google App Engine with Python. В модели у меня есть свойство типа DateTimeProperty, который является datetime.datetime. Когда это создается нет никакого значения (т.е. "Ни один"). Я хочу, выдерживают сравнение, если это, datetime.datetime не Ни один, но я не могу.

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

Оба updated_date и past datetime.datetime.

Я получаю следующую ошибку.

TypeError: не может сравнить datetime.datetime с NoneType

Что корректный путь состоит в том, чтобы сделать это?

7
задан techkilljoy 21 May 2015 в 17:57
поделиться

3 ответа

Вам нужны и , а не или .

Вы также можете использовать is None .

РЕДАКТИРОВАТЬ:

Поскольку вы определили, что object.updated_date не является Нет , это единственная другая возможность состоит в том, что прошедшее равно Нет .

3
ответ дан 6 December 2019 в 14:00
поделиться

Возможно, вы имеете в виду:

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

Если это правда (что подразумевает ненулевое значение), мы проверяем, что это также > = прошлое. При этом используется оценка короткого замыкания, что означает, что второе условие не проверяется, если первое ложно.

6
ответ дан 6 December 2019 в 14:00
поделиться

Учитывая, что предыдущее обсуждение, похоже, установило, что любая из переменных может быть Нет , одним из подходов может быть (при условии, что вы хотите установить object.updated_date , когда одна из переменных равна None ):

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

точка состоит в том, что проверка None in (past, object.updated_date) может быть удобнее, чем семантически эквивалентная альтернатива (past is None или object.update_date is None) (возможно, эпсилон более читается благодаря лучшему компактность, но это, конечно, спорный вопрос стиля).

В стороне и менее спорным вопросом стиля ;-), я настоятельно рекомендую не использовать имена встроенных модулей в качестве имен для ваших собственных переменных (и функций и т. Д.) - объект такое встроенное имя, которое в данном контексте явно используется в ваших собственных целях. Использование obj вместо этого более лаконично, по-прежнему читаемо (возможно, даже лучше ;-) и не имеет недостатков.Вы вряд ли будете "укушены" в любом конкретном случае сомнительной практикой "затенения" встроенных имен своими собственными, но в конечном итоге это произойдет (так как вам может понадобиться нормальное значение затененного имени в течение некоторого позже обычная операция обслуживания), и тогда вы можете оказаться в запутанной ситуации отладки; тем временем вы рискуете запутать других читателей / сопровождающих ... и не получите абсолютно никаких преимуществ взамен этих недостатков.

Я понимаю, что имена многих встроенных модулей Python являются «привлекательной помехой» в этом смысле ... файл , объект , список , dict , set , min , max ... все очевидно привлекательные имена для "файла", "объекта", " список` и т. д. Но стоит научиться сопротивляться именно этому искушению! -)

6
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: