无法添加列表成员
Unable to add list member
我正在尝试添加新的列表成员,但没有成功。
这是我的:
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 中没有单引号或双引号?
你似乎在想这个:
!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,你
也可以从 CommentedSeq
和 TaggedScalar
实例构造它的条目:
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 加载你想要的输出并打印单个项目、它们的类型和
他们的属性)
我正在尝试添加新的列表成员,但没有成功。
这是我的:
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 中没有单引号或双引号?
你似乎在想这个:
!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,你
也可以从 CommentedSeq
和 TaggedScalar
实例构造它的条目:
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 加载你想要的输出并打印单个项目、它们的类型和
他们的属性)