コンテンツにスキップ

往復保存

これは pyrs-yaml の最大の特徴 — Python YAML ライブラリの中でユニークな点です。

往復保存とは?

往復保存とは:YAML をパース → 変更 → シリアライズ → 出力が入力と同一(または意味的に同等) であることを意味します。

ラウンドトリップの例
original = """
# サーバー設定
server:
  host: 0.0.0.0
  port: 8080  # メインポート

# データベースアンカー
database: &db
  host: localhost
  port: 5432

api:
  <<: *db
  endpoint: /api/v1
"""

doc = pyrs_yaml.parse(original)
output = doc.to_yaml()

# すべてのフォーマットとメタデータが保持される
assert "# サーバー設定" in output
assert "# メインポート" in output
assert "&db" in output
# 注意:マージキー(<<)はデフォルトで解決(実体化)され、そのまま出力されません。
# <<: *db をそのまま保持するには resolve_merges=False を使用してください

保持されるもの

要素 保持されるか 備考
独立行コメント キーと値の前
行末コメント 行の末尾
アンカー (&name) 完全なアンカーシンタックス
エイリアス (*name) エイリアス参照が解決される
マージキー (<<) デフォルトで解決される;resolve_merges=False で保持
タグ (!!str, !!int) 明示的なタグが保持される
スカラースタイル Plain, 引用符付き, リテラル, フォールド
チョンピング (\|-, >-) ブロックスカラーインジケーター
フロー/ブロックスタイル []/{} vs ブロックが保持される
コンパクトなシーケンス項目 - host: a はダッシュ行に留まる(メタデータのないマッピング項目のみ)
キーの順序 IndexMap が順序を保証

PyYAML vs pyrs-yaml 往復保存

PyYAML 比較
original = "# コメント\nkey: value  # 行末\n"

# PyYAML: すべて失われる
yaml.safe_dump(yaml.safe_load(original))
# 出力: 'key: value\n'  :material-close:

# pyrs-yaml: すべて保持される
doc = pyrs_yaml.parse(original)
doc.to_yaml()
# 出力: '# コメント\nkey: value  # 行末\n'  :material-check:

パフォーマンス

他のライブラリとの往復パフォーマンス比較:

ライブラリ 往復保存 (大) コメント アンカー タグ
pyrs-yaml 0.08 ms
PyYAML 2.98 ms
ruamel.yaml 6.79 ms

pyrs-yaml は PyYAML より 37 倍速く、ruamel.yaml より 85 倍速く、すべてを保持します。


関連項目