首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyYAML转储布尔

PyYAML转储布尔
EN

Stack Overflow用户
提问于 2016-11-03 06:05:30
回答 1查看 9.5K关注 0票数 7

我正在从yaml文件中加载一个YAML真/假项(下面的例子)。

代码语言:javascript
复制
gzip: False

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

相同的YAML文件正在被另一个脚本读取,作为python格式数据传递,并最终使用

代码语言:javascript
复制
with open(myyaml, 'w') as yaml_file:
    yaml_file.write(yaml.dump(dict, default_flow_style=False)) 

问题是,这会用单引号写真假

代码语言:javascript
复制
gzip: 'False'

,这将导致jinja2模板不将值解释为布尔值,而总是将值设置为true

代码语言:javascript
复制
{{ if gzip }}

是否有一种方法可以转储具有True/False值的YAML文件,这些值被视为布尔值(我的意思是没有引号)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-03 07:36:33

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

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

您可以浏览一下字典,并在dump之前进行一些通用处理。

代码语言:javascript
复制
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)

给予:

代码语言:javascript
复制
gzip: false
intval: 1
strval: abc

请注意,abc没有被引用,因为它只能被解释为字符串。上述当然也转换字符串‘真’或‘假’,将必须保持字符串。如果这不是您想要的,您必须根据键选择转换。

Python的两行代码还有另外两个主要问题:

代码语言:javascript
复制
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。相反,请做: 打开(myyaml,'w')作为yaml_file: yaml.dump(dict,yaml_file,default_flow_style=False)) 你的方式效率很低(除了表现出缺乏理解)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40394852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档