在YAML中如何在我的映射中定义类型?
我遇到问题了。以下是我想要整理文档的结构:
release: JULY
files:
# files
/foo/config.py: 1.6
/bar/dao.py: 1.19
接下来,我想根据给定的版本在Python中返回文件。这部分很简单,但返回的值是浮点数,这就有点麻烦了。我想把它们强制转换成字符串,但不想提前处理。(我不想打开文件,遍历版本,然后在每个条目前加上 !!python/str)
我想标签可能是解决这个问题的方法,但我对文档里的内容感到困惑,不知道该如何或在哪里定义标签。
有没有什么建议?
2 个回答
0
看起来你想做的是创建一个新的类,这个类是从Loader
这个类派生出来的,然后调用add_path_resolver
,大概是这样的:
class MyLoader(yaml.Loader):
pass
MyLoader.add_path_resolver(SOME_TAG, SOME_PATH, str)
f = open('foo.yaml')
the_data = yaml.load(f, Loader=MyLoader)
不过我找不到关于add_path_resolver
的任何文档,也不清楚SOME_TAG
和SOME_PATH
应该是什么。
0
如果你想把浮点数(小数)转换成字符串,其实不需要特别指定类型。你只需要先用 str()
这个函数把它们转换一下就行了:
>>> d = {'release': 'JULY', 'files': {'/path/file': str(1.6), '/path/file2': str(1.9)}}
>>> print yaml.dump(d, default_flow_style=False)
files:
/path/file: '1.6'
/path/file2: '1.9'
release: JULY
如果你想把自己定义的对象进行序列化(转换成可以保存的格式)和反序列化(从保存的格式恢复),你可以通过在你的类里定义 __repr__
方法来做到这一点:
class Foo:
def __init__(self, x):
self.x = x
def __repr__(self):
return "%s(%r)" % (self.__class__.__name__, self.x)
>>> f = Foo(0)
>>> foo = yaml.dump(f)
>>> yaml.load(foo)
<<< Foo(0)