强制引用山药垃圾场Python

2024-06-17 13:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在我开始之前,是的,我已经研究过了,知道YAML不区分引号和非引号,只接受它们的类型。坦白地说,我认为没有引号会更好,但不幸的是,这不是我需要的。因此,请尝试并理解我已经调查过这件事,但仍然需要在我的字符串对象周围加上引号。在

在我的代码里我有一本字典:

data = {dic:[{A:''}, {B:''}, {C:''}, {D:''},...]}

'var*'是通过PyQt4QLineEdit类构造的,代码行提取该行如下所示:

^{pr2}$

所以当我做data['dic'][index]['A'-'Z'] = var*

它变成data = {dic:[{A: 'var1'}, {B:'var2'}, {C:'var3'}, {D:'var4'},...]}

然后我把我所有的数据都转储了:

prettyData = yaml.dump(data, default_flow_style=False, width=10000000)

而且print prettyData我得到了这个:

dic:
  - A: var1
  - B: var2
  - C: var3
  - D: var4
  ...

我尝试了很多方法来让它们出现:

dic:
  - A: 'var1'
  - B: 'var2'
  - C: 'var3'
  - D: 'var4'
  ...

但还没有成功。在这件事上,我听到了不同的意见,从“不可能”到“只是引证一下”,正如你所见,在我的情况下,我不能这样做。在

有什么办法吗?在


Tags: 字符串代码yaml类型datavar引号区分
2条回答

可以覆盖标量的发射器并更改动态发射的值的样式。根据您拥有的其余标量值,您可能需要进行更多的测试来取消is_string。当调用process_scalar时,您已经不知道原始值了,您只有一个带有(unicode)字符串值的事件。在

import sys
import ruamel.yaml as yaml

yaml_str = """\
dic:
  - A: var1    # need to get these strings quoted
  - B: var2
  - C: var3
  - D: var4
  - E: 3       # leave this alone
"""

# the scalar emitter from emitter.py
def process_scalar(self):
    if self.analysis is None:
        self.analysis = self.analyze_scalar(self.event.value)
    if self.style is None:
        self.style = self.choose_scalar_style()
    split = (not self.simple_key_context)
    # VVVVVVVVVVVVVVVVVVVV added
    if split:  # not a key
        is_string = True
        if self.event.value and self.event.value[0].isdigit():
            is_string = False
        # insert extra tests for scalars that should not be ?
        if is_string:
            self.style = "'"
    # ^^^^^^^^^^^^^^^^^^^^
    # if self.analysis.multiline and split    \
    #         and (not self.style or self.style in '\'\"'):
    #     self.write_indent()
    if self.style == '"':
        self.write_double_quoted(self.analysis.scalar, split)
    elif self.style == '\'':
        self.write_single_quoted(self.analysis.scalar, split)
    elif self.style == '>':
        self.write_folded(self.analysis.scalar)
    elif self.style == '|':
        self.write_literal(self.analysis.scalar)
    else:
        self.write_plain(self.analysis.scalar, split)
    self.analysis = None
    self.style = None
    if self.event.comment:
        self.write_post_comment(self.event)

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
dd = yaml.RoundTripDumper
dd.process_scalar = process_scalar
yaml.dump(data, sys.stdout, Dumper=dd)

得到输出¹:

^{pr2}$

¹这是使用ruamel.yaml完成的,我是其中的作者。那个包裹是 皮亚姆的增强。您可以使用后者执行类似的操作,但它会删除输入中的注释。

#!/usr/bin/env python2
# quoting_example.py
import yaml
import yaml.representer

def literal_presenter(dumper, data):
  if isinstance(data, str) and "\n" in data:
      return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
  return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')

yaml.add_representer(str, literal_presenter)
print yaml.dump({"key": "value", "multiline": "foo\nbar"}, default_flow_style=False)

结果是:

^{pr2}$

类似地,您可以为unicode、dict(考虑排序dict)等添加representers

相关问题 更多 >