PyYAML转储布尔值

时间:2016-11-03 06:05:31

标签: python jinja2 pyyaml

我正在从YAML文件加载yaml True / False项目(下面的示例)。

gzip: False

这在Jinja2模板中被正确解释为布尔值True。

另一个脚本读取相同的YAML文件,作为python CGI表单数据传递,最后使用

写入YAML文件
with open(myyaml, 'w') as yaml_file:
    yaml_file.write(yaml.dump(dict, default_flow_style=False)) 

问题是,然后使用单引号

写入True / False
gzip: 'False'

导致jinja2模板不将值解释为boolean并始终将值设置为true

{{ if gzip }}

有没有办法使用被视为布尔值的True / False值转储YAML文件(我的意思是没有引号)。

1 个答案:

答案 0 :(得分:1)

.dump()只是转储它获得的数据,它必须得到一个字符串而不是布尔值作为键gzip的值。由于该字符串值,如果不加引号转储可能被误解为布尔值,则会被引用。

由于您从CGI表单获取材料,因此任何值TrueFalse都将是一个字符串。在转储数据之前,您必须明确地将从CGI获得的这些值转换为布尔值。

您可以在dump之前浏览字典并执行一般处理:

import sys
import yaml

# simulating getting string type values from CGI
data = dict(gzip='False', intval="1", strval="abc") 

for k in data:
    v = data[k]
    try:
        v = int(v)
        data[k] = v
    except ValueError:
        vl = v.lower()
        if vl == 'false':
            data[k] = False
        elif vl == 'true':
            data[k] = True

yaml.safe_dump(data, sys.stdout, default_flow_style=False)

给出:

gzip: false
intval: 1
strval: abc

请注意,abc未引用,因为它不能被解释为除字符串之外的任何其他内容。上面当然也会转换字符串' True'或者“假”'这将不得不保持弦乐。如果这不是您想要的,您必须根据密钥选择转换。

你的两行Python存在另外两个主要问题:

with open(myyaml, 'w') as yaml_file:
    yaml_file.write(yaml.dump(dict, default_flow_style=False)) 
  1. 你永远不应该使用Python关键字(dict)作为变量名,这只会在你的代码中遇到麻烦。
  2. yaml.dump()将数据转储到流中。它有一个功能,如果你没有指定事物必须去的流,输出将被写入内部流对象,从中返回最终值。您不应滥用此权限,然后将此返回值写入yaml_file。而是做:

    with open(myyaml, 'w') as yaml_file:
        yaml.dump(dict, yaml_file, default_flow_style=False))
    

    你的方式效率低下(除了缺乏理解)。