在YAML中如何在我的映射中定义类型?

2 投票
2 回答
2758 浏览
提问于 2025-04-16 20:28

我遇到问题了。以下是我想要整理文档的结构:

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_TAGSOME_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)

撰写回答