您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – pickle的`persistent_id`的替代品?

5b51 2022/1/14 8:21:15 python 字数 5604 阅读 513 来源 www.jb51.cc/python

我一直在使用Python的pickle用于实现基于瘦文件的持久层的模块.该持久层(较大的库的一部分)严重依赖于pickle的persistent_id功能将指定类的对象保存为单独的文件.这种方法唯一的问题是pickle文件不是人类可编辑的,我宁愿让对象以一种格式保存人类可读和可编辑的文本编辑器(例如,YAML或JSON).您知道任何使用人类可编辑格式的库吗?

概述

我一直在使用Pythonpickle
用于实现基于瘦文件的持久层的模块.该
持久层(较大的库的一部分)严重依赖于pickle的persistent_id功能
将指定类的对象保存为单独的文件.

这种方法唯一的问题是pickle文件不是人类
可编辑的,我宁愿让对象以一种格式保存
人类可读和可编辑的文本编辑器(例如,YAML或JSON).

您知道任何使用人类可编辑格式的库吗?
提供与pickle的persistent_id类似的功能?或者,
你有建议在YAML-或者YAML之上实施它们吗?
基于JSON的序列化库,无需重写大部分子集
泡菜?

编辑

在与海报广泛交换意见后,这是一种使用PyYAML实现所需行为的方法.

重要说明:如果Persistable实例具有另一个类实例作为属性,或以某种方式包含在其中一个属性中,则包含的Persistable实例将不会保存到另一个单独的文件中,而是将其内联保存在同一文件中父Persistable实例.据我所知,这种限制也存在于OP的基于pickle的系统中,并且对于他/她的用例可能是可接受的.我没有找到一个优雅的解决方案,这不涉及黑客yaml.representer.BaseRepresenter.

import yaml
from functools import partial

class Persistable(object):
    # simulate a unique id
    _unique = 0

    def __init__(self,*args,**kw):
        Persistable._unique += 1
        self.persistent_id = ("%s.%d" %
                              (self.__class__.__name__,Persistable._unique))

def persistable_representer(dumper,data):
    id = data.persistent_id
    print "Writing to file: %s" % id
    outfile = open(id,'w')
    outfile.write(yaml.dump(data))
    outfile.close()
    return dumper.represent_scalar(u'!xref',u'%s' % id)

class PersistingDumper(yaml.Dumper):
    pass

PersistingDumper.add_representer(Persistable,persistable_representer)
my_yaml_dump = partial(yaml.dump,Dumper=PersistingDumper)

def persistable_constructor(loader,node):
    xref = loader.construct_scalar(node)
    print "Reading from file: %s" % id
    infile = open(xref,'r')
    value = yaml.load(infile.read())
    infile.close()
    return value

yaml.add_constructor(u'!xref',persistable_constructor)


# example use,also serves as a test
class Foo(Persistable):
    def __init__(self):
        self.one = 1
        Persistable.__init__(self)

class Bar(Persistable):
    def __init__(self,foo):
        self.foo = foo
        Persistable.__init__(self)

foo = Foo()
bar = Bar(foo)
print "=== foo ==="
dumped_foo = my_yaml_dump(foo)
print dumped_foo
print yaml.load(dumped_foo)
print yaml.load(dumped_foo).one

print "=== bar ==="
dumped_bar = my_yaml_dump(bar)
print dumped_bar
print yaml.load(dumped_bar)
print yaml.load(dumped_bar).foo
print yaml.load(dumped_bar).foo.one

baz = Bar(Persistable())
print "=== baz ==="
dumped_baz = my_yaml_dump(baz)
print dumped_baz
print yaml.load(dumped_baz)

从现在开始,当您想要将Persistable类的实例保存为单独的文件时,请使用my_yaml_dump而不是yaml.dump.但是不要在persistable_representer和persistable_constructor中使用它!不需要特殊的加载功能,只需使用yaml.load即可.

Phew,这需要一些工作……我希望这有帮助!

总结

以上是编程之家为你收集整理的python – pickle的`persistent_id`的替代品?全部内容,希望文章能够帮你解决python – pickle的`persistent_id`的替代品?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶