.dump()
просто сбрасывает данные, которые он получает, и он должен получить строку вместо логического значения в качестве значения для ключа gzip
. Поскольку это строковое значение, если оно выгружено без кавычек, может быть неверно истолковано как логическое значение, оно будет заключено в кавычки.
Поскольку вы получаете свой материал из формы CGI, любое значение True
или False
будет строкой. Прежде чем сбрасывать ваши данные, вы явно должны преобразовать эти значения, полученные из 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» или «False», которые должны оставаться строками. Если это не то, что вы хотите, вы должны выбрать преобразование на основе ключа.
Есть две другие серьезные проблемы с вашими двумя строками Python:
with open(myyaml, 'w') as yaml_file:
yaml_file.write(yaml.dump(dict, default_flow_style=False))
- Вы никогда не должны использовать ключевое слово Python (
dict
) в качестве имени переменной, это просто вызовет проблемы в дальнейшем в вашем коде.
yaml.dump()
выгружает данные в поток. У него есть возможность: если вы не укажете поток, в который должны идти вещи, вывод записывается во внутренний объект потока, из которого возвращается окончательное значение. Вы не должны злоупотреблять этим, чтобы затем записать это возвращаемое значение в файл yaml_file
. Вместо этого выполните:
with open(myyaml, 'w') as yaml_file:
yaml.dump(dict, yaml_file, default_flow_style=False))
Ваш способ неэффективен (не считая непонимания).
person
Anthon
schedule
03.11.2016
'False'
как логическое значение. В этом нет ничего особенного ни для Jinja2, ни для YAML. Это везде одно и то же. Как он должен знать, что вы хотите проанализировать значение? Вам придется сделать это явно, если ваши данные не хранятся должным образом в файле YAML. - person poke   schedule 03.11.2016yaml.dump
не выводит логическое значение в виде строки, если раньше оно было фактическим логическим значением:yaml.dump({ 'Foo': 'Bar', 'Baz': True })
дает вам'{Baz: true, Foo: Bar}\n'
— без кавычек. В любом случае YAML спроектирован так, чтобы в основном не цитировать. - person poke   schedule 03.11.2016