【问题标题】:Unable to add list member无法添加列表成员
【发布时间】:2019-05-24 15:53:19
【问题描述】:

我正在尝试添加新的列表成员,但没有成功。

这就是我所拥有的:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.comments import CommentedMap as cm
from ruamel.yaml.comments import CommentedSeq as cs

yaml_doc = """\
Condition:
  Like:
    - !Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]
"""
yaml = YAML()
yaml.preserve_quotes = True
yaml.width = 4096
data = yaml.load(yaml_doc)
ref = data['Condition']['Like']

new_member = "!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '456', ':tty:*']]"
# new_member2 = '!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '456', ':tty:*']]'

ref.append(new_member)
# ref.append(new_member2)

yaml.dump(data, sys.stdout)

输出是

Condition:
  Like:
  - !Join ['', ['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]
  - "!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '456', ':tty:*']]"

我不想要双引号。

如果我取消注释与 new_member2 相关的部分,我会得到错误

  File "ec2-recover-2.py", line 18
    new_member2 = '!Join ['',['abc: def: ', !Ref 'XYZ: : Rert', ': ', '456', ': tty: *']]'
                                 ^
SyntaxError: invalid syntax

如何以!Join ['', ['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']] 这种格式添加成员列表,并且在最终 YAML 中没有单引号或双引号?

【问题讨论】:

  • yaml.preserve_quotes = True 可能是造成这种情况的原因。尝试将其设置为 False
  • @rdas 这不是导致它的原因,它应该设置为True,否则:tty:* 周围的虚假单引号将从输出中删除。
  • 我需要yaml.preserve_quotes = Trueflag,因为我需要它用于我的示例中没有显示的文件的其他部分

标签: python yaml ruamel.yaml


【解决方案1】:

你似乎在想:

!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]

是一个纯标量,在 Python 中作为字符串加载。它不是。一个 普通标量不能以感叹号开头,因为 YAML 使用它 介绍一个tag, 你从那里加载的是一个相当复杂的对象:

import ruamel.yaml

yaml = ruamel.yaml.YAML()
data = yaml.load("!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]")
print(data)

打印:

['', ['abc:def:', <ruamel.yaml.comments.TaggedScalar object at 0x7f405265fa58>, ':', '123', ':tty:*']]

您可以从头开始构建此类对象,但加载起来可能更容易 您要添加的列表项,来自其 YAML 字符串表示形式。如果你想做一些DIY,你 也可以从CommentedSeqTaggedScalar 实例构造它:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.comments import CommentedSeq as cs
from ruamel.yaml.comments import TaggedScalar as ts
from ruamel.yaml.scalarstring import SingleQuotedScalarString as sq

yaml_doc = """\
Condition:
  Like:
    - !Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]
"""
yaml = YAML()
yaml.preserve_quotes = True
yaml.width = 4096
data = yaml.load(yaml_doc)
ref = data['Condition']['Like']

new_member = yaml.load("!Join ['',['abc:def:', !Ref 'XYZ::Rert', ':', '456', ':tty:*']]")

ts1 = ts()
ts1.value = 'XYZ::Rert'
ts1.style = "'"
ts1.yaml_set_tag('!Ref')

new_member2 = cs([sq(''), [sq('abc:def:'), ts1 , sq(':'), sq('789'), sq(':tty:*')]])
new_member2.yaml_set_tag('!Join')
new_member2.fa.set_flow_style()

ref.append(new_member)
ref.append(new_member2)

yaml.dump(data, sys.stdout)

给出:

Condition:
  Like:
  - !Join ['', ['abc:def:', !Ref 'XYZ::Rert', ':', '123', ':tty:*']]
  - !Join ['', ['abc:def:', !Ref 'XYZ::Rert', ':', '456', ':tty:*']]
  - !Join ['', ['abc:def:', !Ref 'XYZ::Rert', ':', '789', ':tty:*']]

(如果您真的想弄清楚如何自己构建类似new_member2 的东西,它会有所帮助 从 YAML 加载您想要的输出并打印各个项目、它们的类型和 他们的属性)

【讨论】:

  • 完美运行。感谢@Anthon 提供的所有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多