Повторяющийся шаблон в моем программировании на 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()
Я бы не назвал это "элегантным". Элегантно было бы, если бы объект просто автоматически сохранялся в конце, но я чувствовал, что это было просто и достаточно читабельно, чтобы сделать это сейчас.