2

yaml を使用して、さまざまなデータ型の単一の値をシリアル化することがよくあります。PyYAML はしばしば文字列を追加する'\n''\n...\n'、その出力の最後に追加することに気付きました。私の限られた実験では、これらの末尾の文字を削除しても安全だと思われます。

デフォルトの動作

import yaml, decimal, datetime
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)]
for i in items:
    data = yaml.dump(i)
    print '%r %r %r' % (i == yaml.load(data), i, data)

出力します:

True 'hello' 'hello\n...\n'
True 3 '3\n...\n'
True True 'true\n...\n'
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']\n"
True datetime.date(2013, 5, 25) '2013-05-25\n...\n'

末尾の特殊文字を取り除く

import yaml, decimal, datetime
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)]
for i in items:
    data = yaml.dump(i).replace('\n...\n', '').rstrip('\n')
    print '%r %r %r' % (i == yaml.load(data), i, data)

出力します:

True 'hello' 'hello'
True 3 '3'
True True 'true'
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']"
True datetime.date(2013, 5, 25) '2013-05-25'

コードの 2 番目のブロックも安全です。すべての入力データで機能しますか。これが壊れるケースを探しています。複雑なネストされた入力データであっても、これが壊れる場合に興味があります。

4

1 に答える 1

1

末尾の省略記号はオプションでドキュメントの終わりを示し、これにより YAML は自己区切りになります。これは、複数の YAML ドキュメントを同じストリームに埋め込む場合に便利ですが、必要ない場合は安全に削除できます。

末尾の改行もオプションですが、従来のテキスト解析ツールでは、すべての行が改行で終了することが想定されます。言い換えれば、従来の Unix テキスト処理では、改行を行間のセパレータとしてではなく、現在の行のターミネータとして認識します。終了していない最終行は、個別に処理される例外であり (diff の「ファイルの最後に改行がありません」というメッセージが思い浮かびます)、バグの原因になることがよくあります。最後の改行は削除できますが、正当な理由がない限り削除しないことをお勧めします。

于 2013-05-25T08:54:00.050 に答える