gpt4 book ai didi

python - 为*未*通过 RoundTripLoader 加载的数据结构生成注释?

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:23 24 4
gpt4 key购买 nike

我有一个数据结构,我想向其中添加注释,然后转换为 YAML。

我想避免将数据结构输出为 YAML 并使用 RoundTripLoader 将其加载回来。

有没有一种方法可以将我的数据结构转换为支持 ruamel.yaml 评论接口(interface)的数据结构?

最佳答案

有一种方法,尽管不能保证其接口(interface)稳定。因此,由于缺乏文档,查看您的预期输出的 round_trip_loading() 表示形式或其中的一个小样本通常会有所帮助。

您必须意识到注释附加到结构化节点(映射和序列)的表示的特殊版本上。对于将 safe_load() 作为 Python dict 的映射,这是一个 CommentedMap(),对于序列,它将作为Python list,这是一个 CommentedSeq()

这两个类都可以有一个 .ca 属性来保存结构节点之前可能出现的注释,例如键/值对之后的行尾注释。项目,位于键值对或项目之间的单独行上,以及节点的末尾。

这意味着您必须转换您拥有的任何需要注释的dictlist(这可以自动/递归地完成,例如通过例程comment_prep ()),然后找到正确的评论点和方式。 由于评论操作例程尚未稳定,请确保将评论添加例程包装起来,以便在它们发生变化时获得一个可更新的位置。

import sys
from ruamel.yaml import round_trip_dump as rtd
from ruamel.yaml.comments import CommentedMap, CommentedSeq

# please note that because of the dict the order of the keys is undetermined
data = dict(a=1, b=2, c=['x', 'y', dict(k='i', l=42, m='∞')])

rtd(data, sys.stdout)
print('-' * 30)


def comment_prep(base):
"""replace all dict with CommentedMap and list with CommentedSeq"""
if isinstance(base, dict):
ret_val = CommentedMap()
for key in sorted(base): # here we force sorted order
ret_val[key] = comment_prep(base[key])
return ret_val
if isinstance(base, list):
ret_val = CommentedSeq()
for item in base:
ret_val.append(comment_prep(item))
return ret_val
return base

data = comment_prep(data)
data['c'][2].yaml_add_eol_comment('# this is the answer', key='l', column=15)
rtd(data, sys.stdout)

给出:

c:
- x
- y
- k: i
m: ∞
l: 42
b: 2
a: 1
------------------------------
a: 1
b: 2
c:
- x
- y
- k: i
l: 42 # this is the answer
m: ∞

文件test_comment_manipulation.py ,还有更多示例,是一个值得关注的好地方(随着界面的变化,该文件中的测试也会发生变化)。

关于python - 为*未*通过 RoundTripLoader 加载的数据结构生成注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com