gpt4 book ai didi

python - 如何打印出来!在皮亚姆尔?

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:59 28 4
gpt4 key购买 nike

我有代码将字典打印为 YAML,如下所示:

    import yaml
yaml.dump(
{
"Properties":
{
"ImageId": "!Ref AParameter"
}
},
new_template,
default_flow_style=False
)

这会创建:

Properties:
ImageId: '!Ref AParameter'

请注意 ImageId 的值如何位于引号内?我想打印时不带引号。如何使用 PyYAML 做到这一点?

最佳答案

! 有特殊含义,因为它用于介绍 an explicit tag ,因此不能出现在普通(不带引号)样式标量的开头。具体rule 126 YAML 1.2 规范表明此类普通标量的第一个字符不能是 c-indicator ,这就是 !

这样的标量必须被 PyYAML 自动引用(单引号或双引号),或者放入文字或折叠 block 样式中。

您可以将不带引号的有效 YAML 转储为文字 block 样式标量:

Properties:
ImageId: |
!Ref AParameter

如果没有支持编程,PyYAML 无法做到这一点。您可以使用 ruamel.yaml 来执行此操作(免责声明:我是该包的作者),方法是将值设为 PreservedScalarString 实例: ruamel.yaml.scalarstring.PreservedScalarString("!Ref AParameter ”)

您当然可以使用 !Ref 标记定义一个转储的类,但标记上下文将强制在标量 AParameter 周围加引号:

import sys
import yaml

class Ref(str):
@staticmethod
def yaml_dumper(dumper, data):
return dumper.represent_scalar('!Ref', u'{}'.format(data), style=None)

yaml.add_representer(Ref, Ref.yaml_dumper)


yaml.dump(
{
"Properties":
{
"ImageId": Ref("AParameter"),
}
},
sys.stdout,
default_flow_style=False,
)

给出:

Properties:
ImageId: !Ref 'AParameter'

尽管使用适当的构造函数加载 !Ref Aparameter 是可能的(即,为了安全起见,只是在此处添加了引号)。

如果您还想隐藏这些引号,您可以例如使用 ruamel.yaml 为您的节点定义特殊样式 'x' 并为其提供发射处理:

from ruamel import yaml

class Ref(str):
@staticmethod
def yaml_dumper(dumper, data):
return dumper.represent_scalar('!Ref', u'{}'.format(data), style='x')

@staticmethod
def yaml_constructor(loader, node):
value = loader.construct_scalar(node)
return Ref(value)

yaml.add_representer(Ref, Ref.yaml_dumper)
yaml.add_constructor('!Ref', Ref.yaml_constructor,
constructor=yaml.constructor.SafeConstructor)

def choose_scalar_style(self):
if self.event.style == 'x':
return ''
return self.org_choose_scalar_style()

yaml.emitter.Emitter.org_choose_scalar_style = yaml.emitter.Emitter.choose_scalar_style
yaml.emitter.Emitter.choose_scalar_style = choose_scalar_style

data = {
"Properties":
{
"ImageId": Ref("AParameter"),
}
}

ys = yaml.dump(data, default_flow_style=False)

print(ys)
data_out = yaml.safe_load(ys)
assert data_out == data

以上不会在断言上引发错误,因此数据往返和打印输出正是您想要的:

Properties:
ImageId: !Ref AParameter

关于python - 如何打印出来!在皮亚姆尔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43459203/

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