:私が見つけ
だけ醜い解決策のようなものです。
- 好きな出力は、トップレベルのマッピングの値のくぼみ2を有している(キー
a
、b
など)とa
キーの値である配列の要素のためのインデント4(と-
は2つの位置にプッシュされています。マッピングとシーケンスのインデントレベル間の差分を少なくとも必要とします(個別のコレクションでない場合)。 「通常の」フロースタイルは,
にのみ出力されます。IIRCこれは現在、どのパラメータでも影響を受けることができません。コレクションを放出する際に、「キーであるシーケンスを放出するときには空間を含まない」ことは困難である。 dump()
のオプションを追加するには、いくつかのソースファイルとクラスを変更する必要があります。
ソリューションの表示と
あまり難しい問題:
- あなたのタプルは魔法のようにタグ
!!python/tuple
を取り除くための配列に変換する必要があります。すべてのタプルに影響を与えたくないので、これはtuple
というサブクラスを作成し、これをシーケンスとして表現することで最もよく行われます(実際にはキーとして使用される場合に限りリストとしてタプルを表現することもできます)。 comments.CommentedKeySeq
を使用することができます(ruamel.yaml>=0.12.14
とすると、使用時に適切な表現がサポートされています)ruamel.yaml.round_trip_dump()
- あなたの鍵は、発光する前にテストしたときに単純な鍵ではないので、 '?'(疑問符、スペース)複雑なマッピングキーを示すには
SequenceStartEvent
が単純なキーを開始するようにエミッタを変更する必要があります(フロースタイルで、ブロックスタイルでない場合)。そのようなSequenceStartEventは、これはemitter.py:Emitter.check_simple_key()
とemitter.py:Emitter.expect_block_mapping_key()
を変更する必要があります。(の明示的な必要性を示している可能性があります「?」キー上)style
属性を持っている。
c
のためのあなたのスカラー文字列値は、あなたのスカラ文字列Vのに対し、引用符を取得します値はb
ではありません。 ruamel.yamlの出力では、異なる種類のものを作成するだけで、そのような違いを得ることができます。例えば。それはタイプscalarstring.SingleQuotedScalarString()
(とround_trip_dump()
を使用して)。
そうした場合:
import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap, CommentedKeySeq
assert ruamel.yaml.version_info >= (0, 12, 14)
data = CommentedMap()
data[CommentedKeySeq((2, 3, 4))] = cm = CommentedMap()
cm['a'] = [1, 2]
cm['b'] = 'Hello World!'
cm['c'] = ruamel.yaml.scalarstring.SingleQuotedScalarString('Voilà!')
ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True, version=(1, 2))
あなたが得るだろう:離れて2の今一貫したインデントレベルから
%YAML 1.2
---
[2, 3, 4]:
a:
- 1
- 2
b: Hello World!
c: 'Voilà!'
は、フロースタイルの順に余分なスペース、およびround_trip_dump
の必要な使用は、あなたが大規模なリワークなしであなたが望むものにあなたを近づけるでしょう。
上記のコードが醜いかどうかはもちろん味わいの問題かどうか。
ruamel.yaml.round_trip_load(preserve_quotes=True)
を使用してロードすると、出力は偶然にも往復します。
引用符オーバー制御は必要ありませんし、どちらも重要なマッピング・キーの順序でされていない場合、あなたはまた、通常のダンパーパッチを適用することができます。そして、あなたは、通常のシーケンスを使用することができます
def my_key_repr(self, data):
if isinstance(data, tuple):
print('data', data)
return self.represent_sequence(u'tag:yaml.org,2002:seq', data,
flow_style=True)
return ruamel.yaml.representer.SafeRepresenter.represent_key(self, data)
ruamel.yaml.representer.Representer.represent_key = my_key_repr
を:
data = {}
data[(2, 3, 4)] = cm = {}
cm['a'] = [1, 2]
cm['b'] = 'Hello World!'
cm['c'] = 'Voilà!'
ruamel.yaml.dump(data, sys.stdout, allow_unicode=True, explicit_start=True, version=(1, 2))
はあなたを与えるだろう。
%YAML 1.2
---
[2, 3, 4]:
a: [1, 2]
b: Hello World!
c: Voilà!
allow_unicode=True
を使用して、出力にユニコードを明示的に許可する必要があります(デフォルトはround_trip_dump()
)。
は免責事項を¹:私はruamel.yamlの著者です。
どのような回答です! – nowox
私は 'ruamel.yaml.version_info> =(0,12,14)' - > '(Nowoxのstackoverflowの質問39595807からのメッセージ)' – nowox
あなたの解決策に大きな問題があることは間違いありません。正規のPython辞書をあなたの構造に変換することはできません。私は、データ構造を 'CommentedMap'などで手作業で解析し、期待される結果に到達する必要があります。示されているように、これは実現可能ですが、もし辞書がすでに存在するならば、エレガントではありません。 – nowox