0

私は最近、django JSON フィールド、YAML フィールド、Python フィールドを構築して、CMS を介してデータの任意の複雑な階層を保存/編集する方法を探っています。

JSON、YAML、および Python はすべて、直感的に理解できるように人間がフォーマットすることができますが、テキストを強制的に Python に変換して戻すとすぐに、順序付けされていない新しいオブジェクトが作成されます。

元の入力を再構築するためにデータが実際に順序付けられていなくても、「人間」がそれを構築することを決定した場合でも、入力順序を透過的に保持するポータブルデータスキームはありますか?

たとえば、python/json:

[{ 
   'title': 'First Data Entry!', # intuitive to have certain elements at top
   'is_active': True, 
   'data': 'data here'
   'a_list': [1, 2, 3],
},
{ 
   'title': 'Some Data Entry Here!', 
   'is_active': False, 
   'data': 'data here'
   'a_list': [1, 2, 3],
}] 

または YAML:

ここに画像の説明を入力

私は自分の目ですぐに認識できるようにデータを設定することができます。たとえば、タイトルを慣例により最初の行に設定できます。

これを python オブジェクトに解析し、変更して、再び YAML/JSON/Python に変換するとすぐに、もちろんコメントや順序はなくなります。

これが一般的な問題なのか、それとも私が発明する必要がある車輪なのか、興味があります。シリアライザーを作成することで可能と思わOrderedDictれます(これは私がやったことがありません...)。

私の現在の解決策は、YAML を読み取り専用の生のテキスト フィールドとして使用することです。スタイルを維持するために Python オブジェクトを YAML に書き込もうとしません。

4

2 に答える 2

1

Python の折りたたみスタイル ( >) では、スカラーは保持されず、順序付けも保持されません。

折り畳みスタイルのドロップに耐えることができる場合は、PyYAML の派生物であり、コメントの往復保存とマッピングのキーの順序の往復保存をサポートする python パッケージ¹ ruamel.yamlを使用できます。

from __future__ import print_function

import ruamel.yaml

inp = """\
features:
  show: true
  items:
    - widget: full_width.html  # full width 1
      title: Some Title
      description: >
          Foobar.
      vimeo_id: 20913
      zoom_image: some_url.png
    - widget: 3x_container.html
      items:
          - widget: 3x.html
            title: Some Widget Title
            image: 'foobar.png'
            description: >
                Some Description.
          - widget: 3x.html
            title: Some new title here
            image: ajax_uploads/png1_2.png
            description: >
                Some Description.
"""

code = ruamel.yaml.load(inp, ruamel.yaml.RoundTripLoader)

res = ruamel.yaml.dump(code, Dumper= ruamel.yaml.RoundTripDumper)
print(res, end='')

結果:

features:
  show: true
  items:
  - widget: full_width.html    # full width 1
    title: Some Title
    description: 'Foobar.

      '
    vimeo_id: 20913
    zoom_image: some_url.png
  - widget: 3x_container.html
    items:
    - widget: 3x.html
      title: Some Widget Title
      image: foobar.png
      description: 'Some Description.

        '
    - widget: 3x.html
      title: Some new title here
      image: ajax_uploads/png1_2.png
      description: 'Some Description.

        '

これは、最初の往復後の安定した出力です。

list通常のdictオブジェクトの代わりにcode、コメントが添付されたラップされたバージョン² で構成されます。

¹でインストールしpip install ruamel.yamlます。Python 2.6/2.7/3.3+
で動作 ²マッピングの場合、順序を保持するために使用されます ordereddict

于 2014-11-24T11:31:06.327 に答える