我正在使用yaml解析器 http://pyyaml.org 我希望它始终将某些字段解释为字符串,但是我不知道add_path_resolver()如何工作。

例如:解析器假定“版本”是浮点:

network:
- name: apple
- name: orange
version: 2.3
site: banana

有些文件具有“版本:2”(被解释为int)或“版本:2.3 alpha”(被解释为str)。

我希望它们始终被解释为str。

看来yaml.add_path_resolver()应该让我指定:“当您看到版本时:始终将其解释为str),但并未很好地记录下来。我最好的猜测是:

yaml.add_path_resolver(u'!root', ['version'], kind=str)

但这无效。

有关如何使我的版本字段始终成为字符串的建议?

PS这是一些不同“版本”字符串及其解释的示例:

(Pdb) import yaml
(Pdb) import pprint
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': 2}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': 2.2999999999999998}
(Pdb) pprint.pprint(yaml.load("---\nnetwork:\n- name: apple\n- name: orange\nversion: 2.3 alpha\nsite: banana"))
{'network': [{'name': 'apple'}, {'name': 'orange'}],
 'site': 'banana',
 'version': '2.3 alpha'}
有帮助吗?

解决方案

到目前为止,最简单的解决方案不是使用基本 .load() (无论如何,这是不安全的),但请与 Loader=BaseLoader, ,将每个标量加载为字符串:

import yaml

yaml_str = """\
network:
- name: apple
- name: orange
version: 2.3
old: 2
site: banana
"""

data = yaml.load(yaml_str, Loader=yaml.BaseLoader)
print(data)

给:

{'network': [{'name': 'apple'}, {'name': 'orange'}], 'version': '2.3', 'old': '2', 'site': 'banana'}

其他提示

从当前来源:

 # Note: `add_path_resolver` is experimental.  The API could be changed.

看来它还不完整(尚未完成?)。语法 工作(据我所知)是:

yaml.add_path_resolver(u'tag:yaml.org,2002:str', ['version'], yaml.ScalarNode)

但是,事实并非如此。

似乎首先检查隐式类型解析器,如果匹配,则永远不会检查用户定义的解析器。看 resolver.py 有关更多详细信息(查找功能 resolve).

我建议改变你 version 进入

version: !!str 2.3

这将始终将其胁迫到字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top