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、データ型を正しく出力するために明らかに必要な何らかのメタデータが失われます。OrderedDictruamel.yaml.round_trip_loadTimeStamp

上記の形式 (スペースの代わりに) でTimeStamps を強制的に出力するために渡すことができるオプション、またはメタデータを壊さずに ruamel.yaml の戻り値をディープコピーする方法を探しています。round_trip_dumpT

4

1 に答える 1

1

ruamel.yamlバージョン 0.13.3 では、and ( in )__deepcopy__に追加されましたが、( in )には追加されませんでした。必要なのはforです。CommentedMapCommentedSeqcomments.pyTimeStamptimestamp.py__deepcopy__TimeStamp

次の 2 つのいずれかを行うことができます。

  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 に答える