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
它的参数字典,因为它计划对一些嵌套键进行更改。但是,当我 deepcopy
从 ruamel.yaml.round_trip_load
编辑 OrderedDict
return 时,它会丢失某种元数据,而这些元数据显然是正确打印 TimeStamp
数据类型所必需的。
我正在寻找 一个选项,我可以传递给 round_trip_dump
以强制它以上述格式打印时间戳(使用 T
space)、或一种在不破坏其元数据的情况下深度复制ruamel.yaml return值的方法。
在 ruamel.yaml
版本 0.13.3 中,__deepcopy__
被添加到 CommentedMap
和 CommentedSeq
(在 comments.py
中)但它没有被添加到 TimeStamp
(在 timestamp.py
中),而 TimeStamp
的 __deepcopy__
就是您所需要的。
您可以执行以下两项操作之一:
在调用 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()
的测试可确保您不会在添加该方法(在下一版本中)后覆盖该方法。
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
它的参数字典,因为它计划对一些嵌套键进行更改。但是,当我 deepcopy
从 ruamel.yaml.round_trip_load
编辑 OrderedDict
return 时,它会丢失某种元数据,而这些元数据显然是正确打印 TimeStamp
数据类型所必需的。
我正在寻找 一个选项,我可以传递给 round_trip_dump
以强制它以上述格式打印时间戳(使用 T
space)、或一种在不破坏其元数据的情况下深度复制ruamel.yaml return值的方法。
在 ruamel.yaml
版本 0.13.3 中,__deepcopy__
被添加到 CommentedMap
和 CommentedSeq
(在 comments.py
中)但它没有被添加到 TimeStamp
(在 timestamp.py
中),而 TimeStamp
的 __deepcopy__
就是您所需要的。
您可以执行以下两项操作之一:
在调用
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()
的测试可确保您不会在添加该方法(在下一版本中)后覆盖该方法。