栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

跟踪python中列表和字典的更改?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

跟踪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
,但是对于这些对象似乎还可以。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号