- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用Python的pickle用于实现基于文件的薄持久层的模块。这持久层(较大库的一部分)严重依赖pickle的persistent_id特征将指定类的对象保存为单独的文件。
这种方法的唯一问题是 pickle 文件不是人类的可编辑,而且我更愿意以以下格式保存对象人类可读并可使用文本编辑器进行编辑(例如 YAML 或 JSON)。
您是否知道有任何使用人类可编辑格式的库和提供与pickle 的persistent_id
类似的功能吗?或者,您对在 YAML 或 YAML 之上实现它们有什么建议吗?基于 JSON 的序列化库,无需重写大部分子集 pickle ?
最佳答案
我自己还没有尝试过这个,但我认为你应该能够使用 PyYAML 优雅地做到这一点使用他们所谓的"representers" and "resolvers" .
编辑
与发帖者广泛交换意见后,这里有一种使用 PyYAML 实现所需行为的方法。
重要提示:如果一个 Persistable
实例有另一个这样的实例作为属性,或者以某种方式包含在其属性之一内,则所包含的 Persistable
code> 实例不会保存到另一个单独的文件中,而是会内联保存在与父 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
即可。
唷,这需要一些工作...我希望这会有所帮助!
关于python - pickle `persistent_id` 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7939718/
我一直在使用Python的pickle用于实现基于文件的薄持久层的模块。这持久层(较大库的一部分)严重依赖pickle的persistent_id特征将指定类的对象保存为单独的文件。 这种方法的唯一问
我是一名优秀的程序员,十分优秀!