gpt4 book ai didi

python - 如何更新类实例的历史字典属性并保持顺序?

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:20 25 4
gpt4 key购买 nike

我是类编程的新手。我试图将我的对象的初始属性(这是一个字典)保存在它的历史中,然后用属性的变化更新历史。代码下方:

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"})

我试过了 this但没有成功。似乎 init 函数正在随着属性的更新而更新初始化历史记录,同时在历史记录中首先我想看到第一次初始化的属性。

最佳答案

问题是您正在使用以下代码修改历史记录中的字典:

self.__attributes.update(attr_change)

你基本上是这样做的:

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

这很容易通过在历史记录中存储字典的副本来解决:

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

另见 How to copy a dictionary and only edit the copy .

关于python - 如何更新类实例的历史字典属性并保持顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com