程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了跟踪python中列表和字典的更改?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决跟踪python中列表和字典的更改??

开发过程中遇到跟踪python中列表和字典的更改?的问题如何解决?下面主要结合日常开发的经验,给出你关于跟踪python中列表和字典的更改?的解决方法建议,希望对你解决跟踪python中列表和字典的更改?有所启发或帮助;

当我看到问题时,我很好奇这将如何完成,这是我想出的解决方案。然不像我希望的那么简单,但是它可能会有用。首先,这是行为:

class Tracker(object):
    def __init__(self):
        self.lst = trackable_type('lst', self, List)
        self.dct = trackable_type('dct', self, Dict)
        self.revisions = {'lst': [], 'dct': []}


>>> obj = Tracker()            # create an instance of Tracker
>>> obj.lst.append(1)          # make some changes to List attribute
>>> obj.lst.extend([2, 3])
>>> obj.lst.pop()
3
>>> obj.dct['a'] = 5           # make some changes to Dict attribute
>>> obj.dct.update({'b': 3})
>>> del obj.dct['a']
>>> obj.revisions              # check out revision history
{'lst': [[1], [1, 2, 3], [1, 2]], 'dct': [{'a': 5}, {'a': 5, 'b': 3}, {'b': 3}]}

现在trackable_type(),使所有这些变为可能的函数:

def trackable_type(name, obj, basE):
    def func_logger(funC):
        def wrapped(self, *args, **kwargs):
            before = base(self)
            result = func(self, *args, **kwargs)
            after = base(self)
            if before != after:
                obj.revisions[name].append(after)
            return result
        return wrapped

    methods = (type(List.append), type(List.__setitem__))
    skip = set(['__iter__', '__len__', '__getattribute__'])
    class TrackableMeta(typE):
        def __new__(cls, name, bases, dct):
            for attr in dir(basE):
                if attr not in skip:
                    func = getattr(base, attr)
                    if isinstance(func, methods):
                        dct[attr] = func_logger(funC)
            return type.__new__(cls, name, bases, dct)

    class TrackabLeobject(basE):
        __Metaclass__ = TrackableMeta

    return TrackabLeobject()

基本上,这使用元类重写对象的每个方法,以在对象更改时添加一些修订日志。这没有经过全面的测试,除了List和之外,我还没有尝试过其他任何对象类型Dict,但是对于这些对象似乎还可以。

解决方法

我有一个此类的实例需要跟踪其属性更改的类。

例如:obj.att = 2将东西是很容易可追踪通过简单地重写__setattr__obj

但是,当我要更改的属性是对象本身(如列表或字典)时,就会出现问题。

我将如何跟踪类似obj.att.append(1)或的信息obj.att.pop(2)

我正在虑扩展列表或字典类,但是一旦objobj.att都被初始化,猴子会修补这些类的实例,以便obj.append调用诸如此类的东西时得到通知。不知何故,那感觉并不十分优雅。

我能想到的另一种方法是将实例传递obj到列表初始化中,但这会破坏很多现有代码,而且看起来甚至比以前的方法还不够优雅。

还有其他想法/建议吗?我在这里缺少一个简单的解决方案吗?

大佬总结

以上是大佬教程为你收集整理的跟踪python中列表和字典的更改?全部内容,希望文章能够帮你解决跟踪python中列表和字典的更改?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。