
我一直在使用Python的pickle
用于实现基于瘦文件的持久层的模块.该
持久层(较大的库的一部分)严重依赖于pickle的persistent_id功能
将指定类的对象保存为单独的文件.
这种方法唯一的问题是pickle文件不是人类
可编辑的,我宁愿让对象以一种格式保存
人类可读和可编辑的文本编辑器(例如,YAML或JsON).
您知道任何使用人类可编辑格式的库吗?
提供与pickle的persistent_ID类似的功能?或者,
你有建议在YAML-或者YAML之上实施它们吗?
基于JsON的序列化库,无需重写大部分子集
泡菜?最佳答案我自己还没有尝试过这个,但我认为你应该能够使用他们称之为“representers” and “resolvers”的PyYAML优雅地做到这一点.
编辑
在与海报广泛交换意见后,这是一种使用PyYAML实现所需行为的方法.
重要说明:如果Persistable实例具有另一个此类实例作为属性,或以某种方式包含在其中一个属性中,则包含的Persistable实例将不会保存到另一个单独的文件中,而是将其内联保存在同一文件中父Persistable实例.据我所知,这种限制也存在于OP的基于pickle的系统中,并且对于他/她的用例可能是可接受的.我没有找到一个优雅的解决方案,这不涉及黑客yaml.representer.BaseRepresenter.
import yamlfrom functools import partialclass 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): passPersistingDumper.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 valueyaml.add_constructor(u'!xref',persistable_constructor)# example use,also serves as a testclass 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_fooprint yaml.load(dumped_foo)print yaml.load(dumped_foo).oneprint "=== bar ==="dumped_bar = my_yaml_dump(bar)print dumped_barprint yaml.load(dumped_bar)print yaml.load(dumped_bar).fooprint yaml.load(dumped_bar).foo.onebaz = bar(Persistable())print "=== baz ==="dumped_baz = my_yaml_dump(baz)print dumped_bazprint 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`的替代品?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)