0

yaml を使い始めたばかりで、とても気に入っています。しかし、先日、本当に奇妙に思えるケースに出くわし、何が原因なのかわからない. ファイル パスの場所のリストと、ファイル パスの宛先の別のリストがあります。それらから辞書を作成し、後で読むために yaml を使用してダンプします (私はアーティストと協力して yaml を使用し、人間が読めるようにしています)。

長いリストで申し訳ありません:

source = ['/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_diff.exr', '/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskTapeFloor.1051.exr', '/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskBurnt.1031.exr']
dest = ['/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_diff_diffuse_v0006.exr', '/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_maskTapeFloor_diffuse_v0006.1051.exr', '/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_maskBurnt_diffuse_v0006.1031.exr']
dictionary = dict(zip(source, dest))
print yaml.dump(dictionary)

これは私が得る出力です:

{/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_diff.exr: /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhaw
k_diff_diffuse_v0006.exr,
  /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskBurnt.1031.exr: /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v00
06/blackhawk_maskBurnt_diffuse_v0006.1031.exr,
  ? /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskTapeFloor.1051.exr
  : /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_maskTapeFloor_diffuse_v0006.1051.exr}

yaml.load を使用すると正常に戻りますが、アーティストが必要に応じて編集できるようになると、これは役に立ちません。

4

1 に答える 1

1

これはFAQの最初の質問です。

デフォルトでは、PyYAML はネストされたコレクションがあるかどうかに応じてコレクションのスタイルを選択します。コレクションにネストされたコレクションがある場合、ブロック スタイルが割り当てられます。それ以外の場合は、フロー スタイルになります。

コレクションを常にブロック スタイルでシリアル化する場合は、dump() のパラメーター default_flow_style を False に設定します。

そう:

>>> print yaml.dump(dictionary, default_flow_style=False)
/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_diff.exr: /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_diff_diffuse_v0006.exr
/data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskBurnt.1031.exr: /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_maskBurnt_diffuse_v0006.1031.exr
? /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/model/v026_03/blackhawk_maskTapeFloor.1051.exr
: /data/job/maze/build/vehicle/blackhawk/blackhawkHelicopter/work/data/map/tasks/texture/v0006/blackhawk_maskTapeFloor_diffuse_v0006.1051.exr

まだ完全に美しいとは言えませんが、キーとして 80 文字を超える文字列を使用する場合は、合理的に期待できるほど優れています。

オブジェクト階層でファイルシステム階層 (の一部) をモデル化したり、ツリーの一部にエイリアス (または動的エイリアス) を作成したりすると、YAML はより見栄えがよくなります。しかし、これはオブジェクト モデル レベルで実際に行う必要があることです。YAML に関する限り、繰り返されるプレフィックスでいっぱいの長いパスは単なる文字列です。

于 2013-06-07T21:35:33.803 に答える