首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止别名后红色素yaml.dump对标识语的评论阻塞

防止别名后红色素yaml.dump对标识语的评论阻塞
EN

Stack Overflow用户
提问于 2022-07-05 10:11:04
回答 1查看 46关注 0票数 2

在尝试使用ruamel.yaml加载带有注释和别名的yaml时,我得到了换行符。如何防止这种情况发生?

代码语言:javascript
复制
import ruamel.yaml


yaml_conetent = \
"""
entities:
  leg0: &leg0
    claws:
      leg0claw0: {}
      leg0claw1: {}
  leg1: &leg1
    claws:
      leg1claw0: {}
      leg1claw1: {}
  leg2: &leg2
    claws:
      leg2claw0: {}
      leg2claw1: {}
  leg3: &leg3
    claws:
      leg3claw0: {}
      leg3claw1: {}
anchors:
  cat_with_4_legs: &cat_with_4_legs
    legs:
      leg0: *leg0
      leg1: *leg1
      leg2: *leg2
      leg3: *leg3
cats:
  athena: *cat_with_4_legs      # RED
  ares: *cat_with_4_legs      # WHITE
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_conetent)
yaml.dump(data, sys.stdout)

,其结果是:

代码语言:javascript
复制
...
cats:
  athena: *cat_with_4_legs
                                # RED
  ares: *cat_with_4_legs
                              # WHITE

预期输出:

代码语言:javascript
复制
...
cats:
  athena: *cat_with_4_legs      # RED
  ares: *cat_with_4_legs      # WHITE
EN

回答 1

Stack Overflow用户

发布于 2022-07-05 16:45:24

这是ruamel.yaml中的一个bug,目前还不清楚是什么原因造成的。

我建议您现在对输出进行后处理:

代码语言:javascript
复制
import sys
import ruamel.yaml

yaml_str = """\
entities:
  leg0: &leg0
    claws:
      leg0claw0: {}
      leg0claw1: {}
  leg1: &leg1
    claws:
      leg1claw0: {}
      leg1claw1: {}
  leg2: &leg2
    claws:
      leg2claw0: {}
      leg2claw1: {}
  leg3: &leg3
    claws:
      leg3claw0: {}
      leg3claw1: {}
anchors:
  cat_with_4_legs: &cat_with_4_legs
    legs:
      leg0: leg0
      leg1: leg1
      leg2: leg2
      leg3: leg3
cats:
  athena: *cat_with_4_legs      # RED
  ares: *cat_with_4_legs      # WHITE
"""

def fix_alias_comment(s):
    res = []
    alias_line = None
    for line in s.splitlines(True):
        if ': *' in line:
            alias_line = len(line) - 1
            res.append(line)
            continue
        if alias_line is not None and line.startswith(' ' * alias_line):
            res[-1] = res[-1][:-1] + line[alias_line:]
            continue
        res.append(line)
    return ''.join(res)
    
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout, transform=fix_alias_comment)

这意味着:

代码语言:javascript
复制
entities:
  leg0:
    claws:
      leg0claw0: {}
      leg0claw1: {}
  leg1:
    claws:
      leg1claw0: {}
      leg1claw1: {}
  leg2:
    claws:
      leg2claw0: {}
      leg2claw1: {}
  leg3:
    claws:
      leg3claw0: {}
      leg3claw1: {}
anchors:
  cat_with_4_legs: &cat_with_4_legs
    legs:
      leg0: leg0
      leg1: leg1
      leg2: leg2
      leg3: leg3
cats:
  athena: *cat_with_4_legs      # RED
  ares: *cat_with_4_legs      # WHITE

很丑,但它能完成任务

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72867643

复制
相关文章

相似问题

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