深度拷贝后russl.yaml格式化TimeStamp似乎已被破坏

时间:2017-01-10 19:58:56

标签: python timestamp python-2.x ruamel.yaml

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其参数dict的函数,因为它计划对某些嵌套键进行更改。但是当deepcopyOrderedDict返回ruamel.yaml.round_trip_load时,它会丢失某些显然需要的元数据才能正确打印TimeStamp数据类型。

我正在寻找 我可以传递给round_trip_dump的选项,强制它以上述格式打印TimeStamps(使用T代替空格) ,一种深刻查看ruamel.yaml返回值而不破坏其元数据的方法。

1 个答案:

答案 0 :(得分:1)

ruamel.yaml版本0.13.3中,__deepcopy__已添加到CommentedMapCommentedSeqcomments.py中),但未添加到TimeStamp }(在timestamp.py)中,__deepcopy__ TimeStamp就是您所需要的。

你可以做以下两件事之一:

  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出来

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