【问题标题】:Force quotes in yamlyaml中的强制引号
【发布时间】:2017-09-09 11:44:51
【问题描述】:

我有一个类似这样的 ruby​​ 哈希:

myhash = { title: 'http://google.com'}

我正在尝试将其添加到这样的 yaml 文件中:

params['myhash'] = myhash
File.open('config.yaml', 'w') do |k|
  k.write params.to_yaml
end

问题在于 YAML 会删除链接周围的引号,即使它们是必需的(它们包含“:”)。

根据 Stackoverflow 上的几个问题,YAML 应该只在不需要时删除引号。

我找到了Solution,但它真的很丑,如果有其他解决方案我宁愿不使用它。

我想在这种情况下 yaml 应该包含引号。有什么理由不这样做吗?

注意:链接是动态创建的

【问题讨论】:

    标签: ruby hyperlink yaml


    【解决方案1】:

    几个小时后,我发现它在 python 中更容易。

    用法:python quotes.py *.yml

    • 如果字符串包含“\n”,则此脚本使用文字格式。
    • 使用 ruamel 替换 yaml lib,yaml lib 似乎无法处理某些 UTF-8 条目

      from ruamel import yaml
      import io
      import sys
      
      
      class quote_or_literal(unicode):
          pass
      
      
      def str_presenter(dumper, data):
          if data.count("\n"):  # check for multiline string
              return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
          else:
              return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')
      
      
      yaml.add_representer(quote_or_literal, str_presenter)
      
      
      def quote_dict(d):
          new = {}
          for k, v in d.items():
              if isinstance(v, dict):
                  v = quote_dict(v)
              else:
                  v = quote_or_literal(v)
              new[k] = v
          return new
      
      
      def ensure_quotes(path):
          with io.open(path, 'r', encoding='utf-8') as stream:
              a = yaml.load(stream, Loader=yaml.Loader)
              a = quote_dict(a)
      
          with io.open(path, 'w', encoding='utf-8') as stream:
              yaml.dump(a, stream, allow_unicode=True,
                        width=1000, explicit_start=True)
      
      
      if __name__ == "__main__":
          for path in sys.argv[1:]:
              ensure_quotes(path)
      

    【讨论】:

      【解决方案2】:

      您的示例字符串不需要引号。来自the specs

      通常,YAML 坚持“:”映射值指示符与值之间用空格分隔。此限制的一个好处是“:”字符可以在纯标量中使用,只要它后面没有空格即可。

      例如:

      h = { value1: 'quotes: needed', value2: 'quotes:not needed' }
      puts h.to_yaml
      

      结果:

      ---
      :value1: 'quotes: needed'
      :value2: quotes:not needed
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-21
        • 2021-01-30
        • 2014-07-18
        • 2015-02-08
        • 2015-03-12
        • 2017-01-27
        • 1970-01-01
        相关资源
        最近更新 更多