在新创建的ruamel.yaml.comments.CommentedMap上使用.yaml_set_comment_before_after_key().yaml_add_eol_comment()所做的注释不会显示在转储字符串中.请参阅下面的预期输出与实际输出.

请注意,ruamel.yaml==0.17.4是产生预期输出的最新版本.任何晚于此版本的版本都不会(见下文).

# Minimal reproducible example
import ruamel.yaml

data = ruamel.yaml.comments.CommentedMap()
data['key'] = 'value'
data.yaml_set_start_comment('Start comment', indent=0)
data.yaml_set_comment_before_after_key('key', before='Before comment', indent=0)
data.yaml_add_eol_comment('End-of-line comment', 'key', column=0)

yaml_str = ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper)
print(yaml_str)

Using:
Python 3.10.8
ruamel.yaml==0.17.32
ruamel.yaml.clib==0.2.7

By going through ruamel.yaml's version history, I have found that the latest ruamel version that produces the expected output to be 0.17.4 (Can be installed using pip install ruamel.yaml==0.17.4)
I don't understand why versions higher than this do not produce the expected output anymore. Is this perhaps a bug since April 2021?

预期输出:

# Start comment
# Before comment
key: value # End-of-line comment

实际yields (使用ruamel.yaml==0.17.32):

# Start comment
key: value

推荐答案

首先,您的代码不是最小的,因为它创建了一个StringIO的缓冲区,然后 prints该缓冲区的内容.不要这样做:

yaml_str = ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper)
print(yaml_str)

直接流到sys.stdout(带有dump(data, sys.stdout)),更简洁,更快,使用的内存要少得多.

I不理解的是,为什么您希望在升级时能够继续使用已弃用的函数 升级到较新的版本,然后期望它们继续工作 像往常一样.您应该使用YAML()实例:

import sys
import ruamel.yaml

    
yaml = ruamel.yaml.YAML()
 
data = ruamel.yaml.comments.CommentedMap()
data['key'] = 'value'
data.yaml_set_start_comment('Start comment', indent=0)
data.yaml_set_comment_before_after_key('key', before='Before comment', indent=0)
data.yaml_add_eol_comment('End-of-line comment', 'key', column=0)
yaml.dump(data, sys.stdout)

这提供了:

# Start comment
# Before comment
key: value # End-of-line comment

并锁定您正在使用的ruamel.yaml版本,因为那些用于处理的内部 routine comments 将在future 发生变化.

Python相关问答推荐

如何修复fpdf中的线路出血

PyTorch卷积自动编码器,输出维度与输入不同

带有pandas的分区列上的过滤器的多个条件read_parquet

Pandas 群内滚动总和

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

如何销毁框架并使其在tkinter中看起来像以前的样子?

如何让我的Tkinter应用程序适合整个窗口,无论大小如何?

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

Chatgpt API不断返回错误:404未能从API获取响应

比较两个数据帧并并排附加结果(获取性能警告)

Julia CSV for Python中的等效性Pandas index_col参数

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

如何指定列数据类型

如何从需要点击/切换的网页中提取表格?

合并帧,但不按合并键排序

幂集,其中每个元素可以是正或负""""

如果包含特定值,则筛选Groupby