Повторяющийся шаблон в моем программировании на Python в GAE - это получение некоторой сущности из хранилища данных, а затем, возможно, изменение этого объекта на основе различных условий. В конце концов мне нужно .put() вернуть объект обратно в хранилище данных, чтобы гарантировать, что любые изменения, которые могли быть сделаны с ним, будут сохранены.
Однако часто не было внесенных изменений, и окончательный .put() - это просто пустая трата денег. Как легко убедиться, что я только поместил объект, если он действительно изменился?
Код может выглядеть примерно как
def handle_get_request():
entity = Entity.get_by_key_name("foobar")
if phase_of_moon() == "full":
entity.werewolf = True
if random.choice([True, False]):
entity.lucky = True
if some_complicated_condition:
entity.answer = 42
entity.put()
Я мог бы поддерживать "измененный" флаг, который я установил, если какое-либо условие изменило сущность, но это кажется очень хрупким. Если я забуду установить его где-нибудь, тогда изменения будут потеряны.
Что я использовал
def handle_get_request():
entity = Entity.get_by_key_name("foobar")
original_xml = entity.to_xml()
if phase_of_moon() == "full":
entity.werewolf = True
if random.choice([True, False]):
entity.lucky = True
if some_complicated_condition:
entity.answer = 42
if entity.to_xml() != original_xml: entity.put()
Я бы не назвал это "элегантным". Элегантный был бы, если бы объект просто автоматически сохранялся автоматически в конце, но я чувствовал, что это было просто и доступно для чтения, чтобы сделать это сейчас.