1
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 的函数,因为它计划对一些嵌套键进行更改。但是当我deepcopy从 中OrderedDict返回时ruamel.yaml.round_trip_load,它会丢失一些显然需要的元数据,以便TimeStamp正确打印数据类型。

我正在寻找可以传递给它的选项round_trip_dump以强制它以上述格式(T而不是空格)打印时间戳,或者在不破坏其元数据的情况下深度复制 ruamel.yaml 返回值的方法。

4

1 回答 1

1

ruamel.yaml0.13.3 版本中,__deepcopy__添加到CommentedMapand CommentedSeq(in comments.py) 但它没有添加到TimeStamp(in 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版本出来

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

于 2017-01-10T20:31:40.463 回答