在YAML中使用python - 如何在地图中定义类型?

时间:2011-06-28 16:57:16

标签: python yaml pyyaml

我很难过。这就是我想要将我的文档构建为:

release: JULY
files:
    # files
    /foo/config.py:       1.6
    /bar/dao.py:                1.19

然后我想根据python中给出的版本返回文件。这部分很容易,但是它将值作为浮点数返回,这会带来问题。我想在没有预处理的情况下将它们强制转换为字符串。 (我不想打开文件,遍历版本,并在每个条目前加上!! python / str)

我认为标签是这样做的方式,但我无法根据我在何处/何处定义标签来制作文档的正面或反面。

任何指针?

2 个答案:

答案 0 :(得分:0)

如果要将float值转储为字符串,则不需要指定字符串的类型,只需先在其上调用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)

答案 1 :(得分: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_TAGSOME_PATH应该是什么。