Я запускаю небольшое приложение на 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
Что корректный путь состоит в том, чтобы сделать это?
Вам нужны и
, а не или
.
Вы также можете использовать is None
.
РЕДАКТИРОВАТЬ:
Поскольку вы определили, что object.updated_date
не является Нет
, это единственная другая возможность состоит в том, что прошедшее
равно Нет
.
Возможно, вы имеете в виду:
if object.updated_date and object.updated_date >= past:
Если это правда (что подразумевает ненулевое значение), мы проверяем, что это также > = прошлое. При этом используется оценка короткого замыкания, что означает, что второе условие не проверяется, если первое ложно.
Учитывая, что предыдущее обсуждение, похоже, установило, что любая из переменных может быть Нет
, одним из подходов может быть (при условии, что вы хотите установить 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
... все очевидно привлекательные имена для "файла", "объекта", " список` и т. д. Но стоит научиться сопротивляться именно этому искушению! -)