题
我正在使用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
这将始终将其胁迫到字符串。
不隶属于 StackOverflow