Ruyaml:可以定义线宽吗?

Ruyaml: Possible to define line width?

当使用 ruyaml 转储到文件时,是否可以设置 YAML 行宽?

当使用 pyyaml 将 YAML 对象转储到文件并且其内容相当长 82+(或类似的)字符时,会插入一个换行符。这可以通过为转储函数提供参数“width”来规避,您可以在其中提供特定长度或如下例所示“inf”。

ruyaml 中似乎缺少这种可能性。

Traceback (most recent call last):
  File "/home/anton/work/repos/identityhub/bug.py", line 19, in <module>
    ruamel.dump(ruamel_content, ruamel_out.open("w"), width=float("inf"))
TypeError: dump() got an unexpected keyword argument 'width'

PS。还添加了 ruamel.yaml 示例,以验证它不是 ruyaml 分支中的问题。

from pathlib import Path
from ruyaml import YAML as RUYAML
from ruamel.yaml import YAML as RUAMEL
import yaml

ruyaml = RUYAML()
ruamel = RUAMEL()
ruyaml.indent(mapping=2, sequence=4, offset=2)

file_path = Path("test.yaml")
ruyaml_out = Path("ruyaml.yaml")
ruamel_out = Path("ruamel.yaml")
yaml_out = Path("yaml.yaml")

ruyaml_content = ruyaml.load(file_path)
ruyaml.dump(ruyaml_content, ruyaml_out.open("w"))

ruamel_content = ruamel.load(file_path)
ruamel.dump(ruamel_content, ruamel_out.open("w"))

yaml_content = yaml.load(file_path.open())
yaml.dump(yaml_content, yaml_out.open("w"), width=float("inf"))

示例 YAML 以查看效果:

Foo:
  Bar: A very long string A very long string A very long string A very long string A

偶然发现 YAML 实例上的“宽度”成员变量,似乎与将 width=X 发送到 PyYaml 转储函数具有相同的效果。

yaml = YAML()
yaml.width = float("inf")

你应该使用:

yaml = YAML()
yaml.width = 2 ** 32

虽然float("inf") > 2给出了True,而yaml.width值目前是用来比较的,我不能保证在某些时候内部代码需要一个实际的整数。自从做了 int(float"inf")) 会给你

OverflowError: cannot convert float infinity to integer

除非转换为 int 时捕获到该异常,否则您的代码将不再有效。