2017-01-10 2 views
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する必要がある機能を持っています。しかし、deepcopyOrderedDictruamel.yaml.round_trip_loadから返されたとき、TimeStampデータ型を正しく印刷するために必要なメタデータが失われています。ruamel.yamlフォーマットが

私は どちらか私は( T代わりのスペースで)上記の形式でタイムスタンプを印刷し、それを強制的に round_trip_dumpに渡すことができますオプション、 または ruamel.yaml戻り値をdeepcopyする方法を探しています

メタデータを壊さずに

+1

この問題を解決したruamel.yaml 0.13.8が利用可能になりました。ご報告いただきありがとうございます。 – Anthon

答えて

1

バージョン0.13.3 ruamel.yamlでは、__deepcopy__は(comments.py中)CommentedMapCommentedSeqに追加されましたが、それは(timestamp.py中)TimeStampに追加されなかった、とTimeStampため__deepcopy__は、何が必要であること。

次の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のを待ちます

第1のオプションでhasattr()でのテストそれが追加されると(次のリリースで)そのメソッドを上書きしていないことを確認します。

+0

実際に私は 'ruamel.yaml == 0.12.5'を使用していますので、0.13.3で追加されたすべてのものを持っていないと思います。私はこの回避策を試して、それは0.12.5でも私のために働いた。ありがとう! – Quuxplusone

+0

元々、最初のオプションを提案していましたが、それは0.13.2より前のものですが、それは問題ではないことをテストすることで実現しました。私はそのオプションを削除しましたが、イントロラインを見直すのを忘れました。 – Anthon

関連する問題