【发布时间】:2020-07-23 19:47:36
【问题描述】:
如果我加载这个示例 YAML 文件:
aliases:
- &a1
b1: 5 # Comment for b1=5
c1: 3 # Comment for c1=3
model:
obj1:
<<: *a1
d1: 7 # Comment for d1=7
obj2:
*a1
obj3:
*a1
使用此代码:
import ruamel.yaml as yaml
with open("test.yaml") as fp:
d = yaml.load(fp, yaml.RoundTripLoader)
def showcmts(d):
for k,v in d.items():
print("Key {} has {}".format(k, (d.ca.items[k][2] if k in d.ca.items and d.ca.items[k][2] is not None else "no comment")))
print("Model obj1 contents and comments are:")
showcmts(d["model"]["obj1"])
print("Model obj2 contents and comments are:")
showcmts(d["model"]["obj2"])
print("Model obj3 contents and comments are:")
showcmts(d["model"]["obj3"])
我得到这个输出:
Model obj1 contents and comments are:
Key d1 has CommentToken('# Comment for d1=7\n', line: 8, col: 18)
Key b1 has no comment
Key c1 has no comment
Model obj2 contents and comments are:
Key b1 has CommentToken('# Comment for b1=5\n', line: 2, col: 18)
Key c1 has CommentToken('# Comment for c1=3\n\n', line: 3, col: 18)
Model obj3 contents and comments are:
Key b1 has CommentToken('# Comment for b1=5\n', line: 2, col: 18)
Key c1 has CommentToken('# Comment for c1=3\n\n', line: 3, col: 18)
如何获取与obj1/b1 和obj1/c1 关联的cmets? cmets 正在加载并正确读取 obj2/b1 等,但我需要它们也可以用于obj1/b1 等。
【问题讨论】:
-
您从哪里获得使用
d = yaml.load(fp, yaml.RoundTripLoader)加载 YAML 的示例?您应该使用几年前推出的新 API(使用YAML()实例)。 -
好问题 - 我看到当前版本的文档引用了 YAML() 实例方法。这段代码只有几个月的历史。我相信我从stackoverflow.com/questions/52043027/… 的示例开始,然后在寻找修复导出后添加了 RoundTripLoader 位。我将更新 YAML() 方法的代码。
-
该示例已经使用了新的 API。我只是好奇我是否可以更新(或建议更新)一些示例以确保人们从新 API 开始(与旧 API 相比,它允许更多控制,尤其是在输出方面)
标签: ruamel.yaml