我能插入一条线吗拉梅尔亚姆勒的评论地图?

2024-10-01 07:43:37 发布

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

我知道这与this SO question有关,但我最关心的是这是否会影响诸如保留的注释之类的事情。在

import ruamel.yaml as yaml

yaml_str = """\
first_name: Art
occupation: Architect  # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)

# I'd like to extend CommentedMap so that I can do something like:
data.insert(1, 'last_name', 'Vandelay')

print(yaml.dump(data, Dumper=yaml.RoundTripDumper))
应输出: ^{pr2}$ 应输出:
first_name: Art
last_name: Vandelay    # This is an occupation comment
occupation: Architect
about: Art Vandelay is a fictional character that George invents...

Tags: nameanyamldatathatiscommentthis
1条回答
网友
1楼 · 发布于 2024-10-01 07:43:37

在Python2.7和Python3.X上,至少拉梅尔亚姆勒0.11.11,这很好:

import ruamel.yaml

yaml_str = """\
first_name: Art
occupation: Architect  # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""

data = ruamel.yaml.round_trip_load(yaml_str)
data.insert(1, 'last name', 'Vandelay')

print(ruamel.yaml.round_trip_dump(data))

给出:

^{pr2}$

因为行尾注释与CommentedMap中的行的键相关联。(在Linux Mint上使用Python 2.7.11拉梅尔亚姆勒0.11.10.)

这在旧版本的上不起作用拉梅尔亚姆勒使用Python3作为.insert()是成熟的ruamel.ordereddict的一个特性,而标准库中的OrderedDict没有这种方法。因此,您需要将.insert()函数移植到CommentedMap上:

import ruamel.yaml
from ruamel.yaml.comments import CommentedMap
from ruamel.yaml.compat import ordereddict

yaml_str = """\
first_name: Art
occupation: Architect  # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""

def com_insert(self, pos, key, value, comment=None):
    od = ordereddict()
    od.update(self)
    for k in od:
        del self[k]
    for index, old_key in enumerate(od):
        if pos == index:
            self[key] = value
        self[old_key] = od[old_key]
    if comment is not None:
        self.yaml_add_eol_comment(comment, key=key)

CommentedMap.insert = com_insert

data = ruamel.yaml.round_trip_load(yaml_str)
data.insert(1, 'last name', 'Vandelay', comment="new key")

print(ruamel.yaml.round_trip_dump(data))

在Python3上给出:

first_name: Art
last name: Vandelay    # new key
occupation: Architect  # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...

请注意,insert()有一个可选参数,允许您为新插入的键值对指定注释。上面的操作是因为从CommentedMap中删除一个键并不会删除与该键相关联的注释。所以我临时将旧的键值对存放在od 复制并在后面插入新的值

上面的insert,带注释,已添加到拉梅尔亚姆勒0.11.11用于 Python 2和Python 3


.round_trip_load()相当于.load(...., Loader=ruamel.yaml.RoundTripLoader, ...),而{}相当于`.dump(…,Dumper)=ruamel.yaml.roundtripper公司,允许\-unicode=True,…)

相关问题 更多 >