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
的选项,强制它以上述格式打印TimeStamps(使用T
代替空格) ,或一种深刻查看ruamel.yaml返回值而不破坏其元数据的方法。
答案 0 :(得分:1)
在ruamel.yaml
版本0.13.3中,__deepcopy__
已添加到CommentedMap
和CommentedSeq
(comments.py
中),但未添加到TimeStamp
}(在timestamp.py
)中,__deepcopy__
TimeStamp
就是您所需要的。
你可以做以下两件事之一:
在调用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__
等待版本0.13.8出来
第一个选项中使用hasattr()
的测试确保一旦添加该方法(在下一个版本中),您不会覆盖该方法。