Powtarzającym się schematem w moim programowaniu w języku Python na GAE jest pobieranie pewnej encji ze składnicy danych, a następnie ewentualna zmiana tej jednostki na podstawie różnych warunków. W końcu muszę .put() podmiot z powrotem do magazynu danych, aby zapewnić, że wszelkie zmiany, które mogły być wprowadzone do niego zostaną zapisane.Elegancki sposób na uniknięcie .put() na niezmienionych jednostkach
Często nie wprowadzano żadnych zmian, a ostateczna .put() to strata pieniędzy. Jak łatwo upewnić się, że umieszczam tylko jednostkę, jeśli naprawdę się zmieniła?
Kod może wyglądać
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()
mogłem utrzymać „przemienieni” Flag którą ustawiony jeśli każdy stan zmienił podmiot, ale to wydaje się bardzo kruche. Jeśli zapomnę go gdzieś ustawić, to zmiany zostaną utracone.
Co skończyło się używając
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()
Nie nazwałbym to "elegancki". Byłoby elegancko, gdyby obiekt w końcu sam się ostatecznie uratował, ale czułem, że jest to na razie proste i czytelne.
Co powiecie na mieszanie jednostki przed i po?To oczywiście wymaga stworzenia funkcji mieszającej, która może lub nie może być wykonalna dla twojego przypadku. – carlpett
@carlpett Dzięki, zauważyłem, że db.Model ma już metodę to_xml(), której mogę użyć do porównania zamiast tworzyć własną funkcję skrótu . – Bemmu