- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有代码将字典打印为 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/
我是一名优秀的程序员,十分优秀!