ruamel.yaml 深度复制后的时间戳格式似乎已损坏

ruamel.yaml formatting of TimeStamp after deepcopy seems broken

import copy
import ruamel.yaml

d = ruamel.yaml.round_trip_load("foo: 2016-10-12T12:34:56\n", preserve_quotes=True)
d2 = copy.deepcopy(d)
assert ruamel.yaml.round_trip_dump(d) == "foo: 2016-10-12T12:34:56\n"
assert ruamel.yaml.round_trip_dump(d2) == "foo: 2016-10-12 12:34:56\n"

我有一个函数需要 deepcopy 它的参数字典,因为它计划对一些嵌套键进行更改。但是,当我 deepcopyruamel.yaml.round_trip_load 编辑 OrderedDict return 时,它会丢失某种元数据,而这些元数据显然是正确打印 TimeStamp 数据类型所必需的。

我正在寻找 一个选项,我可以传递给 round_trip_dump 以强制它以上述格式打印时间戳(使用 T space)、一种在不破坏其元数据的情况下深度复制ruamel.yaml return值的方法。

ruamel.yaml 版本 0.13.3 中,__deepcopy__ 被添加到 CommentedMapCommentedSeq(在 comments.py 中)但它没有被添加到 TimeStamp(在 timestamp.py 中),而 TimeStamp__deepcopy__ 就是您所需要的。

您可以执行以下两项操作之一:

  1. 在调用 copy.deepcopy() 之前将以下内容添加到您的代码中:

    from ruamel.yaml.timestamp import TimeStamp
    
    def ts__deepcopy__(self, memo):
        ts = TimeStamp(self.year, self.month, self.day, 
                       self.hour, self.minute, self.second)
        ts._yaml = copy.deepcopy(self._yaml)
        return ts
    
    if not hasattr(TimeStamp, '__deepcopy__'):
        TimeStamp.__deepcopy__ = ts__deepcopy__
    
  2. 等待0.13.8版本出来

在第一个选项中使用 hasattr() 的测试可确保您不会在添加该方法(在下一版本中)后覆盖该方法。