gpt4 book ai didi

python-3.x - 使用 yaml.dump 时如何去掉字符串中的引号

转载 作者:行者123 更新时间:2023-12-03 07:23:32 49 4
gpt4 key购买 nike

我正在尝试使用 ruamel.yaml 从有序字典生成 cloudformation YAML 模板。我需要在某些字符串前添加“!Sub”前缀,这是一个云模板函数引用,其方式不与其余字符串一起用引号引起来,例如:

Type: AWS::Glue::Job
Properties:
Role2: !Sub 'arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}'

我开始的测试代码如下所示:

from ruamel import yaml
from collections import OrderedDict

def ordered_dict_presenter(dumper, data):
return dumper.represent_dict(data.items())

test = OrderedDict(
{
"Type": "AWS::Glue::Job",
"Properties": {
"Name": "test_job",
"Role": "!Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}",
"Role2": "Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}",
},
}
)
yaml.add_representer(OrderedDict, ordered_dict_presenter)

print(yaml.dump(test, default_style=None, default_flow_style=False))

它输出这个 yaml:

Type: AWS::Glue::Job
Properties:
Name: test_job
Role: '!Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}'
Role2: Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}

当一个字符串以非字母字符开头时,它似乎会被自动引用。我尝试过自定义代表来摆脱引号,但到目前为止没有任何运气。我怎样才能输出这个?

最佳答案

首先,你真的不应该再使用旧的 API,已经有了一个新的 API,它允许更多的控制回顾一下你这几年所做的事情。

其次,您不能将看起来像标签的内容放入字符串中,并且没有得到引号,在加载期间会像标签一样加载,您可能想要那样,但这会产生无限数量的字符串(所有以!) 在 YAML 中不可表示。

如果您不知道从哪里开始,要做的就是尝试往返(加载然后转储)您所需的结果:

import sys
import ruamel.yaml

yaml_str = """\
Type: AWS::Glue::Job
Properties:
Role2: !Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}
"""

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这给出:

Type: AWS::Glue::Job
Properties:
Role2: !Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}

这确认了 ruamel.yaml 可以创建输出。现在您只需从头开始即可。为此你可以检查data,尤其是data['Properties']['Role2'](如果事情不经常往返,但没有必要,意味着你无法生成你想要的东西,但找出在这种情况下如何做到这一点可能会更困难)。

print(type(data['Properties']['Role2']))

打印:

Type: AWS::Glue::Job
Properties:
Role2: !Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}
<class 'ruamel.yaml.comments.TaggedScalar'>

现在您只需了解 TaggedScalar 的工作原理(源代码位于 comments.py 中):

import sys
import ruamel.yaml

data = {}
data['Properties'] = props = {}
props['Role2'] = ruamel.yaml.comments.TaggedScalar('arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}', style=None, tag='!Sub')

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.dump(data, sys.stdout)

给予:

Properties:
Role2: !Sub arn:aws:iam::${AWS::AccountId}:role/${GlueServiceRole}

或者,如果您确实想要引号,也可以指定 style="'"style='"'

关于python-3.x - 使用 yaml.dump 时如何去掉字符串中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67194300/

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