YamlDocument クラス
概要¶
YamlDocument は pyrs-yaml のコアクラスで、解析済みの YAML ドキュメントを保持します。IndexMap を使用したカスタム AST により、100% ラウンドトリップ、完全なキー順序保持、ネストされたコメントの保持、詳細なメタデータを実現します。
class YamlDocument:
"""pyrs-yaml のコアクラス。"""
# ... C 拡張で実装 ...
コンストラクター¶
YamlDocument()¶
内部コンストラクター。ユーザーが直接呼び出すことはありません。pyrs_yaml.parse() から返されます。
プロパティ¶
version— YAML ドキュメントバージョンschema— スキーマ(core,failsafe,json)tags— タグ一覧anchors— アンカー一覧source— YAML ソーステキスト
メソッド¶
to_yaml()¶
ドキュメントを YAML 文字列に変換します。
to_yaml(
indent: int = 2,
allow_unicode: bool = True,
default_flow_style: bool = False,
sort_keys: bool = False,
width: int = 80,
resolve_aliases: bool = True,
strip_comments: bool = False,
preserve_quotes: bool = True,
) -> str
パラメータ:
indent— インデントスペース数(デフォルト: 2)allow_unicode— Unicode 文字を許可(デフォルト: True)default_flow_style— デフォルトでフロースタイルを使用(デフォルト: False)sort_keys— キーをソート(デフォルト: False)width— 折り返し幅(デフォルト: 80)resolve_aliases— エイリアスを解決(デフォルト: True)strip_comments— コメントを除去(デフォルト: False)preserve_quotes— クォートを保持(デフォルト: True)
戻り値: YAML 文字列
例:
doc = pyrs_yaml.parse("key: value\n# comment")
yaml_str = doc.to_yaml()
to_yaml_with_options()¶
カスタムオプションで YAML に変換します。
to_yaml_with_options(
indent_size: int = 2,
explicit_start: bool = False,
explicit_end: bool = False,
sort_keys: bool = False,
) -> str
パラメータ:
indent_size— インデントレベルごとのスペース数 (デフォルト: 2)explicit_start— ドキュメント先頭に---を追加 (デフォルト: False)explicit_end— ドキュメント末尾に...を追加 (デフォルト: False)sort_keys— キーをアルファベット順にソート (デフォルト: False)
例:
yaml_str = doc.to_yaml_with_options(
indent_size=4,
explicit_start=True,
sort_keys=True,
)
to_dict()¶
Python dict/list に変換します。エイリアス参照を解決し、ネイティブ Python タイプを返します。
to_dict() -> dict[str, Any] | list[Any]
戻り値: 辞書またはリスト
例:
doc = pyrs_yaml.parse("key: value")
data = doc.to_dict() # {'key': 'value'}
get()¶
トップレベルのマッピングキーによるリテラルキー検索で値を取得します(__getitem__/__setitem__ と一貫)。キーは .、[、]、$ を含めても常に文字どおりのキーとして扱われ、パスとして解釈されません。
get(key: str, default: Any = None) -> Any
戻り値: 値、見つからない場合はデフォルト
root_type()¶
ルートノードの型を文字列で取得します。
root_type() -> str
戻り値: "scalar", "mapping", "sequence", "null", "alias" のいずれか。
例:
print(doc.root_type()) # "mapping"
to_json()¶
ドキュメントを JSON 文字列にシリアライズします。
to_json(indent: int = 2) -> str
戻り値: JSON 文字列
validate()¶
JSON Schema に基づいてドキュメントの内容を検証します。
validate(schema: dict[str, Any]) -> None
スロー: YamlValidateError — 検証エラー
reparse()¶
保存されたソーステキストをその場で再パースし、スキーマやマージ動作の変更を可能にします。
reparse(resolve_merges: bool = True, schema: str = "core") -> None
パラメータ:
resolve_merges—<<: *aliasマージキーを解決するかどうか (デフォルト:True)schema— 型解決スキーマ:"core","json","failsafe", または"yaml1.1"(デフォルト:"core")
スロー:
TypeError— ソーステキストが保存されていないYamlParseError— 再パースに失敗
例:
doc = pyrs_yaml.parse("x: on")
print(doc.get("x")) # "on" (string, core schema)
doc.reparse(schema="yaml1.1")
print(doc.get("x")) # True (bool, yaml1.1 schema)
source()¶
このドキュメントの作成に使用された元の YAML ソーステキストを返します。ドキュメントがその場で編集された場合、ソースは最初のアクセス時に現在のツリーから遅延して再シリアライズされます。
source() -> str
戻り値: YAML 文字列。parse() で作成されていない場合(例: from_dict())は空文字列。
例:
doc = pyrs_yaml.parse("key: value")
print(doc.source()) # "key: value"
編集メソッド¶
アトミック編集
pyrs-yaml の編集操作はすべてアトミックです。失敗した場合、ドキュメント(リビジョンを含む)は変更されません。
ドキュメントをその場で編集し、すべてのメタデータ(コメント、アンカー、タグ、スタイル)を保持します。編集は JSONPath スタイルのパス($.a.b、$.items[0])でノードを特定します。
set()¶
パスで値を置き換えます。
set(path: str, value: Any, create_missing: bool = False) -> None
- スカラー、
dict、listをサポート;tupleはサポートされません(YamlEditErrorをスロー) - 既存のスカラーを置換する場合、対象のメタデータが保持されます;パスが存在しない場合はマッピングの末尾に新しいキーを追加
- 空のドキュメント(
""からパース)にパスを設定すると、マッピングルートが自動的に作成されます create_missing=Trueを指定すると、不足している中間マッピングキーが自動的に作成されます
例:
doc = pyrs_yaml.parse("a:\n b: 1")
doc.set("$.a.b", 42)
doc.set("$.a.c", True) # 新しいキーを追加
doc.set("$", {"x": 1}) # ルート全体を置換
# create_missing で不足キーを自動作成
doc.set("$.b.c.d", 2, create_missing=True)
walk()¶
AST の深さ優先・先行順の走査で、Node オブジェクトを生成します。
walk() -> Generator[Node, None, None]
Node.walk() とは異なり、このメソッドはRust バックエンドです — AST を Python dict に変換せずに直接走査するため、大規模ドキュメントで大幅に高速です。
生成するもの: ルートを含む、ドキュメントツリー内のすべてのノードの Node オブジェクト。
例:
doc = pyrs_yaml.parse("a:\n b: 1\n c: 2\n")
for node in doc.walk():
print(node._path, node.root_type)
# () mapping
# ('a',) mapping
# ('a', 'b') scalar
# ('a', 'c') scalar
scalars()¶
walk() と同様ですが、スカラー/null ノードのみを生成します。
scalars() -> Generator[Node, None, None]
生成するもの: ドキュメントツリー内のすべてのスカラーまたは null ノードの Node オブジェクト。
例:
doc = pyrs_yaml.parse("a: hello\nb: null\n")
for node in doc.scalars():
print(node._path, node.value)
# ('a',) hello
# ('b',) None
insert()¶
シーケンスの指定インデックスに値を挿入します。
insert(path: str, index: int, value: Any) -> None
index はシーケンスの現在の長さまで指定できます(len への挿入は追加と同等)。負のインデックスは末尾から数えます(-1 は最後の要素の前に挿入)。パスはシーケンスノードに解決される必要があります。
append()¶
シーケンスの末尾に値を追加します。
append(path: str, value: Any) -> None
delete()¶
パスでノードを削除します。マッピングの順序は保持されます。
delete(path: str) -> None
rename()¶
マッピングキーをその場でリネームします(位置とメタデータを保持)。
rename(path: str, new_key: str) -> None
ルートまたは複合(非スカラー)キーのリネームは YamlEditError をスローします。
node()¶
ドキュメントルートの Node を返します。
node() -> Node
find()¶
パスでノードを検索します。ワイルドカード([*])とディープスキャン(..)をサポート — その場合、ノードのリストを返します。
find(path: str) -> Node | list[Node]
スロー:
YamlPathError— パスが不正、または編集パスでワイルドカード/..を使用YamlEditError— 編集を適用できない(tuple、エイリアス経由の編集、ルート/複合キーのリネーム、スカラーへのナビゲーション、インデックス範囲外)YamlDocumentError— ドキュメント編集後に陳腐化したNodeを使用
参照: インプレース編集ガイド
例:
doc = pyrs_yaml.parse("items: [1, 2, 3]")
doc.set("$.items[1]", "two")
doc.insert("$.items", 1, "x") # items: [1, x, 2, 3]
doc.append("$.items", 4)
doc.rename("$.items", "list") # マッピングキーをリネーム
del doc["list"] # doc.delete("$.list") と同等
ダンダー メソッド¶
__getitem__()¶
キー(マッピング)またはインデックス(シーケンス)でアクセスします。
doc = pyrs_yaml.parse("key: value")
value = doc["key"] # 'value'
__setitem__()¶
ルートマッピングキーを設定します(doc.set() のルート用糖衣構文)。
doc["key"] = value
__delitem__()¶
ルートマッピングキーを削除します(doc.delete() のルート用糖衣構文)。
del doc["key"]
__contains__()¶
キーが存在するか確認します。
"key" in doc # True
__len__()¶
アイテム数を取得します。
len(doc)
__iter__()¶
キー(マッピング)または値(シーケンス)を反復します。
for key in doc:
print(key)
__repr__()¶
デバッグ表現。
repr(doc) # "YamlDocument({key: value})"
__str__()¶
文字列表現。
str(doc) # "YamlDocument({key: value})"
__eq__()¶
等値比較。2つの YamlDocument が同じ内容を持つ場合、true を返します。
doc1 == doc2 # True or False
使用例¶
import pyrs_yaml
doc = pyrs_yaml.parse("""
name: Alice
age: 30
""")
print(doc.get("name")) # Alice
print(doc.root_type()) # mapping
print(len(doc)) # 2
print("name" in doc) # True
for key in doc:
print(key, doc[key]) # name Alice, age 30