Обновить историю объекта Python как словарь и сохранить первый элемент - PullRequest
0 голосов
/ 28 октября 2018

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

import datetime
import pytz

class Property:
    """ Simple property class """ 

    @staticmethod
    def _current_time():
        utc_time = datetime.datetime.utcnow()
        return pytz.utc.localize(utc_time)

    def __init__(self, link, attributes):
        self._link = link
        self.__attributes = attributes
        self._history = [(Property._current_time(), attributes)]

    def update(self, new_attributes):
        def dictdiff(d1, d2):                                              
            return dict(set(d2.items()) - set(d1.items()))
        attr_change = dictdiff(self.__attributes, new_attributes) 
        self.__attributes.update(attr_change)
        self._history.append((Property._current_time(), attr_change))

    def show_attributes(self):
        return self.__attributes

    def show_history(self):
        # how to show changes in time?
        return self._history


prop = Property(1234, {"Price":3000, "Active":"Yes"})
prop.update({"Price":2500, "Active":"Yes"})
prop.update({"Active":"No"})
prop.show_history()

И вывод:

Out[132]: 
[(datetime.datetime(2018, 10, 28, 10, 24, 19, 712385, tzinfo=<UTC>),
  {'Price': 2500, 'Active': 'No'}),
 (datetime.datetime(2018, 10, 28, 10, 24, 19, 712385, tzinfo=<UTC>),
  {'Price': 2500}),
 (datetime.datetime(2018, 10, 28, 10, 24, 19, 712385, tzinfo=<UTC>),
  {'Active': 'No'})]

Первый элемент в истории должен быть:

(datetime.datetime(2018, 10, 28, 10, 24, 19, 712385, tzinfo=<UTC>),
  {"Price":3000, "Active":"Yes"})

Я пытался это но безуспешно.Кажется, что функция init обновляет историю инициализации при обновлении атрибутов, и в то же время в истории я хочу видеть атрибуты, которые были инициализированы впервые.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы хотите, чтобы первая запись истории была копией attributes.

self._history = [(Property._current_time(), dict(attributes))]

Как ваш код, первая запись истории ссылки текущий словарь атрибутов.

0 голосов
/ 28 октября 2018

Проблема в том, что вы изменяете словарь в истории с помощью этого кода:

self.__attributes.update(attr_change)

В основном вы делаете это:

>>> attributes = {}
>>> history = [attributes]
>>> attributes.update(foo=3)
>>> history
[{'foo': 3}]

Это легко исправитьхранение копии словаря в истории:

self._history = [(Property._current_time(), attributes.copy())]

См. также Как скопировать словарь и редактировать только копию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...