YAMLとは?書き方・構文を詳しく解説します

最近よく目にすることが多くなったYAMLですが、なんとなく使っている方も多いのではないでしょうか?これはYAMLの構文が比較的簡単で読みやすく書きやすいので、なんとなく使えてしまうのでしょう。

YAMLは設定ファイル、データの永続化、アプリケーション間でのデータ交換などに利用できます。同じような目的で使えるものとしてはXMLやJSONなどもありますが、今後はYAMLが利用される場面がますます増えるでしょう。

このように将来性のあるYAMLなので、せっかくなので「なんとなく」ではなく「しっかり理解」できるように、この記事では詳しく解説していきたいと思います。

YAMLにおいて空白類が重要な役割を果たします。そのためこの記事では単に「スペース」と書かれている場合は半角スペースを意味し、ホワイトスペースと明確に区別します。ホワイトスペースは「スペース(文字)」と「タブ(文字)」の2つであるとYAMLの仕様で定義されています。

またYAMLの例で、必要な場合に半角スペースは「.」、タブは「→」、改行は「↓」と視覚的に分かりやすように表現することがあります。そしてYAMLを実際にPyYAMLでPythonに読み込んだ結果を「=>」に示します。

目次

YAMLとは

YAMLとは、プログラミング言語のデータを人間にわかりやす形式でシリアライズするための言語です。

シリアライズとはファイルやネットワークへ送信できる形式(シリアルデータ)に変換することです。シリアライズしてファイルへ出力するというのが最も基本的な使い方です。反対にYAMLファイルを読み込み、(デシリアライズして)プログラミング言語のデータ構造へ変換することももちろんできます。

このようなシリアライズやデシリアライズはプログラミング言語ごとに実装されたYAML処理系(プロセッサ)によって処理されます。前述したように、この記事ではPythonのYAML処理系であるPyYAMLを使って結果を示します。PyYAMLについては次の記事をご参照ください。

YAMLは汎用的なシリアライズ言語として設計していますので、Pythonはもちろん、RubyやPerlなど他の多くのプログラミング言語で使用できます。

YAMLのデータ構造

YAMLでは3つの基本的なデータ構造とタグを使って、さまざなプログラミング言語のネイティブなデータ構造を表現します。これらはYAML処理系に読み込まれ、プログラミング言語の適切なデータ型にマップされます。

YAMLで提供されるこの基本的データ構造は次のたった3つしかありません。

  • スカラー
  • シーケンス
  • マッピング

スカラーは文字列や整数などの単一のデータ型を表します。シーケンスとマッピングはコレクションです。つまり0個以上の他のオブジェクトを要素とするオブジェクトです。シーケンスは順序順けられたコレクションで、PythonのリストやPerlの配列に対応します。マッピングは順序のないキー/値のペアのコレクションです。Pythonの辞書やPerlのハッシュテーブルに対応します。

タグはこれらの基本データ構造に型情報を関連づけます。

YAMLのスタイル

YAMLには前述の基本データ構造を記述するための2つのスタイルがあります。

  • フロースタイル
  • ブロックスタイル

フロースタイルは明示的なインジケータで構造を示します。ブロックスタイルはPythonのようにインデントを使って構造を示します。

読みやすさと表現力の異なるこれらのスタイルは、YAMLの中で一定の規則のもと混在して使用することができます。

スカラーのフロースタイルにはさらにダブルクウォート、シングルクウォート、プレーンの3つのスタイルがあります。スカラーのブロックスタイルにはリテラル(literal)とフォールデッド(folded)という2つのスタイルがあります。

YAMLのデータ構造とスタイルをまとめると次のようになります。最初にフロースタイルです。

  • フロースカラー
    • ダブルクウォート
    • シングルクウォート
    • プレーン
  • フローコレクション
    • フローシーケンス
    • フローマッピング

ブロックスタイルは次のようになります。

  • ブロックスカラー
    • リテラル
    • フォールデッド
  • フローコレクション
    • フローシーケンス
    • フローマッピング

YAML記法の簡単な例

文章だけではYAMLのイメージは伝わりづらいので、実際に簡単な例を見てみましょう。詳しい構文は後述するのでなんとなく理解してもらえれば大丈夫です。

最初にシーケンスから見ていきましょう。フローシーケンスは「[」と「]」インジケータで囲みで示されます。各要素は「,」で区切ります。

[one, two, three]
=> ['one', 'two', 'three']

ブロックシーケンスは「-」インジケータで示されます。

- one
- two
- three
=> ['one', 'two', 'three']

マッピングのキー/値のペアは「キー: 値」のように記述します。フロースタイルのマッピングは「{」と「}」インジケータで囲みます。各項目は「,」で区切ります。

{one: 1, two: 2, three: 3}
=> {'one': 1, 'two': 2, 'three': 3}

ブロックマッピングスタイルは各キー/値のペアを1行で記述します。

one: 1
two: 2
three: 3
=> {'one': 1, 'two': 2, 'three': 3}

フロースカラースタイルには、さらに3つのスタイルがあります。ダブルクウォートとシングルクウォートのスタイルは、コンテンツをそれぞれ「”」または「’」で囲みます。プレーンスタイルは裸のテキストです。

doble: "text"
single: 'text'
plain: text
=> {'doble': 'text', 'single': 'text', 'plain': 'text'}

ブロックスカラースタイルには、さらにリテラルとフォールデッドというスタイルがあります。リテラルスタイルは「|」インジケータで示されます。

|
  one
  two
=> 'one\ntwo\n'

フォールデッドスタイルは「>」インジケータで示されます。

>
  one
  two
=> 'one two\n'

コメント

コメントは「#」インジケータで示されます。「#」以降はコメントになします。

YAML文書の構造

YAML文書は、YAMLの構文で記述された1つの論理的な塊です。通常は1つのファイルに1つのYAML文書しかありませんが、複数のYAML文書を1つのファイルに記述することもできます。

YAML文書には文書構造を示す2つのマーカー行を記述することができます。

  • 1つ目はディレクティブの終わりを示す「ディレクティブ終了マーカー」です。
  • 2つ目はYAML文書の終わりを示す「文書終了マーカー」です。

ディレクティブとはYAML処理系への指示で、「YAML」と「TAG」の2つのディレクティブが定義されています。各YAML文書にはディレクティブを関連付けることができます。
ディレクティブは「%」インジケータで始まり、ディレクティブ名とパラメータのリストが続きます。文書の先頭で「%」で始まる行はディレクティブと見なされます。各ディレクティブは個別の行にインデントなしで記述します。

ディレクティブ終了マーカー行はディレクティブの終わりを示し、ディレクティブとYAML文書のコンテンツを分離します。ディレクティブ終了マーカー行は「—(3つのハイフン)」で示します。

次に使用例を示します。

%YAML 1.2
---
Document

YAMLディレクティブは、YAML文書が準拠するYAMLのバージョンを指定します(最新バージョンは1.2)。

文書終了マーカー行は「…(3つのピリオド)」で示し、その名の通りYML文書の終わりを示します。

Document
...

ディレクティブが無くても文書の開始を示すためにディレクティブ終了マーカー行で文書を開始しても構いません。ドキュメント終了マーカー行もあってもなくても構いません。

---
Document
...

複数のYAML文書

1つのファイルに複数のYAML文書を含めることもできます。その場合は、少なくとも1つ目の文書は文書終了マーカー行で終了するか、次の文書をディレクティブ終了マーカーで開始する必要があります。文書終了マーカー行はYAML処理系に次の文書のディレクティブのスキャンするように通知する役割もあります。

次の例は2つのマーカー行を明示的に指定しています。

%YAML 1.2
---
Document1
...
%YAML 1.2
---
Document2
...

YAMLファイル

YAML文書は通常、ファイルに保存されまが、そのようなファイルの拡張子には一般的に「.yml」または「.yaml」が用いられます。

YAMLはUTF-8、UTF-16、UTF-32の文字エンコーディングをサポートしています。

改行コードにはCR(キャリッジリターン)、LF(ラインフィード)、CRLF(キャリッジリターン+ラインフィード)のいずれもでも使用できます。

フロースタイル

ここからスカラーとコレクション(シーケンスとマッピング)のフロースタイルについて説明していきます。ブロックスタイルについては後述します

フロースカラースタイル

スカラーのフロースタイルには前述した通り、読みやすさと表現力の異なる次の3つスタイルがあります。

  • ダブルクウォート
  • シングルクウォート
  • プレーン

ダブルクウォートスタイルはコンテンツの境界を「”」で示し、エスケープシーケンスが使用できるので最も表現力があります。一方、プレーンスタイルは裸のコンテンツなので読みやすいが、最も制限のあるスタイルです。

ダブルクウォートスタイル

ダブルクウォートスタイルはコンテンツを「”」インジケータで囲みます。

"foo bar"
=> 'foo bar'

ダブルクウォートスタイルの中ではエスケープシーケンスを使用できます。そのためコンテンツに「\」と「”」を使う場合は、これらをエスケープする必要があります。エスケープシーケンスについては後述します。

ダブルクウォートスタイルのコンテンツが複数行に渡る場合、改行は折り畳まれます。そのため、長い文字列を複数行に記述することができます。改行の折り畳みの規則はいくつかあります。まずは次の例を見てみましょう。

"foo..↓
→bar..↓
..baz"
=> 'foo bar baz'

最初に1行目の改行に注目します。まず、改行の直前のホワイトスペースはコンテンツから除外されます。そして改行は単一のスペースに変換されます。次行(2行目)の行頭のホワイトスペースも除外されます。2行目の末尾のホワイトスペース、改行、その次の行の行頭スペースも同様に折り畳まれます。

この折り畳み規則をまとめると次のようになります。ただし、これは改行の後の次の行が非空行の場合の規則です。

ダブルクウォートの折り畳み規則(次行が非空行)
  • 改行直前のホワイトスペースは除外される。
  • 改行は単一スペースに変換される。
  • 次行の行頭ホワイトスペースも除外される。

改行の後の次の行が空行の場合は規則が少し異なります。次の例を見てみましょう。

"foo..↓
..↓
.↓
.bar..↓
..baz"
=> 'foo\n\nbar baz'

まず、1行目の改行直前のホワイトスペースがコンテンツから除外されるのは先ほどと同様です。そして1行目の改行は破棄され、2行目以降の空行の改行はコンテンツとして維持されます。空行の後の非空行(barの行)の行頭ホワイツスペースもコンテンツから除外されます。bar行の改行は次行が非空行なので、前述の規則で折り畳まれます。

改行の後に空行が続く場合の規則をまとめると次のようになります。

ダブルクウォートの折り畳み規則(次行が空行)
  • 改行直前のホワイトスペースは除外される。
  • 最初の改行は廃棄される。
  • 空行の改行はコンテンツとして維持される。
  • 空行後の非空行の行頭ホワイトスペースも除外される。
エスケープシーケンス

エスケープシーケンスとは特殊な文字を、表示可能な通常文字の並びで表したものです。一般にバックスラッシュ(\)ともう一文字の2文字の組み合わせで特殊文字1文字を表します。

エスケープシーケンスはダブルクウォートスタイルの中でのみ使用できます。よく使用されるエスケープシーケンスは次のものです。

エスケープシーケンス意味
\nラインフィード文字
\tタブ文字
\\バックスラッシュ文字
\”ダブルクウォート文字
よく使用するエスケープシーケンス

一般のプログラミング言語によくあるシングルクウォートをエスケープする「\’」は、YAMLにありません。

次はエスケープシーケンスを使用した例です。

"aaa\"bbb\\ccc\tddd\n"
=> 'aaa"bbb\\ccc\tddd\n'

シングルクウォートスタイル

シングルクウォートスタイルはコンテンツを「’」インジケータで囲みます。シングルクウォートでエスケープシーケンスは使用できません。したがって「\」は通常文字として扱われます。しかし、シングルクウォートの中で「’」を使用したい場合は「”(2つのシングルクウォート)」のように重ねる必要があります。

'I''m fine.'
=> "I'm fine."

改行の折り畳み規則はダブルクウォート同じです。次行が非空行の場合の規則は次のとおりです。

シングルクウォートの折り畳み規則(次行が非空行)
  • 改行直前のホワイトスペースは除外される。
  • 改行は単一スペースに変換される。
  • 次行の行頭ホワイトスペースも除外される。

次行が非空行の場合の例を次に示します。

'foo..↓
→bar..↓
..baz'
=> 'foo bar baz'

改行の後に空行が続く場合の規則もダブルクウォートと同様です。

シングルクウォートの折り畳み規則(次行が空行)
  • 改行直前のホワイトスペースは除外される。
  • 最初の改行は廃棄される。
  • 空行の改行はコンテンツとして維持される。
  • 空行後の非空行の行頭ホワイトスペースも除外される。

空行が続く場合の例を次に示します。

'foo..↓
..↓
.↓
.bar..↓
..baz'↓
=> 'foo\n\nbar baz'

プレーンスタイル

プレーンスカラーはインジケータの無い裸のテキストです。エスケープシーケンスも使用できません。

プレーンスカラーでは、テキスト前後のホワイトスペースはコンテンツから除外されます。そのためコンテンツの先頭または末尾にホワイトスペースを含めることが出来ません。コンテンツを空にすることも出来ません。

テキスト前後のホワイトスペース削除
  • テキストの前後のホワイトスペースはコンテンツから除外される。

次に例を示します。

..foo.bar..
=> 'foo bar'

複数行のプレーンスカラーも改行は折り畳まれます。折り畳み規則は次の通りです。ただし、これは改行の後に非空行が続く場合です。

プレーンスカラーの折り畳み規則(次行が非空行)
  • テキストの前後のホワイトスペースはコンテンツから除外される。
  • 改行は単一スペースに変換される。

次行が非空行の場合の例を次に示します。

foo..↓
.bar.↓
..baz↓
..↓
=> 'foo bar baz'

末尾の空行と、その直前の改行(つまりbazの改行以降)はプレーンスカラーのコンテンツではありません(したがってこれらはコンテンツには含まれません)。これらはスカラーのコンテンツと単に次の項目を区切るためのものとみなされます。

改行に空行が続く場合の規則は次のとおりです。

プレーンスカラーの折り畳み規則(次行が空行)
  • テキストの前後のホワイトスペースはコンテンツから除外される。
  • 空行直前の改行は破棄される。
  • 空行の改行は維持される。

空行が続く場合の例を次に示します。

foo..↓
.↓
↓
.bar.↓
=> 'foo\n\nbar'

フローコレクション

コレクションにはシーケンスとマッピングがありますが、それぞれにフロースタイルの記法があります。

フローシーケンス

フローシーケンスは要素を「[」と「]」インジケータで囲みます。各要素は「,」で終わります(最後の要素の「,」は省略可能)。

[1, 2, 3]
=> [1, 2, 3]

任意のフロースタイルのデータ構造が、シーケンスの要素になり得ます。

[
"double",
'single',
plain,
[1, 2],
{key: val}
]
=> ['double', 'single', 'plain', [1, 2], {'key': 'val'}]

フローマッピング

フローマッピングはキー/値のペアの要素を「{」と「}」インジケータで囲みます。各要素は「,」で終わります(最後の要素の「,」は省略可能)。

キーは「?」インジケータで示します(省略可能)。値は「:」インジケータで示します。「:」インジケータと値の間にはホワイトスペースを置いて両者を区切る必要があります。

「?」を省略した場合、キーは1行に記述する必要があります。

{1: one, 2: two}
=> {1: 'one', 2: 'two'}

キーを示す「?」インジケータを明示的に指定することもできます。この場合、キーは1行に制限されません。

{
? foo
  bar
: 1,
? baz
  hoge
: 2
}
=> {'foo bar': 1, 'baz hoge': 2}

YAMLではキーに使用できるデータ構造に制限はありません。そのためキーをシーケンスやマッピングにすることもできます。

ブロックスタイル

ブロックスタイルはインデントで構造を示します。インデントは行頭の0個以上のスペースで示されます。インデントにタブを使うことはできません。

スカラーのブロックスタイルにはリテラル(literal)とフォールデッド(folded)という2つのスタイルがあります。

リテラルスタイルは改行した文字列の改行がそのまま残るので、複数行のテキストを記述するのに便利です。フォールデッドで改行は折り畳まれるので、長い行のテキストを複数行で記述することができます。

コレクションであるシーケンスとマッピングにも、それぞれにブロックスタイルがあります。

ブロックスカラースタイル

最初にリテラルとフォールデッドの両者に共通の事柄について説明した後、それぞれのスタイルについて説明します。

インデントレベル

ブロックスタイルはインデントで構造を示しますが、そのインデントは最初の非空行の行頭スペースの数で決定されます。

|
.↓
..↓
..aaa↓
..↓
=> '\n\naaa\n'

この例で最初の非空行はaaaの行なので、その行頭のスペースによってインデントレベルが決定されます。この例ではインデントはスペース2つ分です。

インデント以降はホワイトスペースもスカラーのコンテンツです。末尾のホワイトスペースもスカラーのコンテンツです。

- |
..aaa.↓
...↓
...bbb↓
..→ccc↓
- >
..aaa.↓
...↓
...bbb↓
..→ccc↓
=> ['aaa \n \n bbb\n\tccc\n', 'aaa \n \n bbb\n\tccc\n']

上述の例でインデントはスペース2つ分です。それ以外はすべてスカラーのコンテンツとなっていることを確認してみてください。

切り詰め(Chomping)

ブロックスカラーで末尾の(0以上の)空行とその直前の改行は切り詰め(Chomping)の対象になります。

切り詰めには3つの種類があり、それぞれのインジケータによって示されます。インジケータを指定しなかった場合のデフォルトはクリップです。

種類インジケータ切り詰めの処理内容
キープ+末尾の空行およびその直前の改行は、スカラーのコンテンツの一部として維持される。
ストリップ末尾の空行およびその直前の改行は、スカラーのコンテンツから除外される。
クリップ無し末尾の空行はコンテンツから除外されるが、その直前の改行はコンテンツとして維持される。
切り詰めの種類

次は切り詰めの例です。

literal-keep: |+
..keep↓
..↓
↓
literal-strip: |-
..strip↓
..↓
↓
literal-clip: |
..clip↓
..↓
↓
folded-keep: >+
..keep↓
..↓
↓
folded-strip: >-
..strip↓
..↓
↓
folded-clip: >-
..clip↓
..↓
↓
=> 
{'literal-keep': 'keep\n\n\n',
 'literal-strip': 'strip',
 'literal-clip': 'clip\n',
 'folded-keep': 'keep\n\n\n',
 'folded-strip': 'strip',
 'folded-clip': 'clip'}

リテラルスタイル

スカラーのブロックスタイルであるリテラルスタイルは、「|」インジケータで示されます。

リテラルスカラー内では、(インデント以外の)すべての文字がスカラーのコンテンツと見なされます。末尾の(0以上の)空行とその直前の改行は切り捨て(Chomping)の対象です。

|
..foo↓
..→bar.↓
=> 'foo\n\tbar \n'

リテラルスタイルでは、すべての改行はコンテンツとして維持され、折り畳まれることはありません。そのため長いテキストを改行して記述することはできません。

フォールデッドスタイル

フォールデッドスカラースタイルは「>」インジケータで示されます。

フォールデッドスタイルの行は、いくつかの場合に改行が折り畳まれます。そのため、フォールデッドスタイルでは長い行を読みやすいように複数行に記述することができます。

次の例を見てください。

>
..aaa↓
..bbb↓
..ccc↓
=> 'aaa bbb ccc\n'

この例で行頭の2つのスペースはインデントです。そのためこれらはスカラーのコンテンツではありません。テキスト「aaa」の後の改行は折り畳まれて単一のスペースに変換されています。テキスト「bbb」の後の改行も同様です。テキスト「ccc」の後の改行は切り詰め(Chomping)の対象です。この例でcccの後の改行はコンテンツとして残ります。

この例は、次の規則により改行が単一スペースに折り畳まれます。

フォールデッドスタイルの折り畳み規則(非スペースで始まるテキスト行が続く場合)
  • 「非スペースで始まるテキスト」の後に改行が続き、次行も「非スペースで始まるテキスト」の場合、その改行は単一スペースに変換される。

もう一つ例を見てみましょう。

>
..aaa↓
..bbb↓
..↓
.↓
..ccc↓
=> 'aaa bbb\n\nccc\n'

aaaの後の改行は前述の規則により折り畳まれます。テキスト「bbb」の後ろの改行の後は空行が続いています。この場合、bbbの後ろの改行および空行の改行は次の規則により折り畳まれます。ccc行の改行は切り詰め(Chomping)の対象です。

フォールデッドスタイルの折り畳み規則(非スペースで始まるテキスト行の間に空行がある場合)
  • 「非スペースで始まるテキスト」の後に改行が続き、その後に1つ以上の空行、そして空行の後は「非スペースで始まるテキスト」が続く場合、テキスト行の改行は破棄され、空行の改行はコンテンツとして維持される。

上述の2つの規則に当てはまらない場合は折りたたみは行われません。そのような例を見てみましょう。

>
.
..
..aaa↓
..↓
...bbb↓
...ccc↓
↓
..ddd↓
..eee↓
..↓
...fff↓
=> '\n\naaa\n\n bbb\n ccc\n\nddd eee\n\n fff\n'

最初の2行は折り畳まれず、改行はコンテンツとして残ります。aaa行の改行は、その後に空行が続きますが、空行の後は”スペースで始まる”テキスト(.bbb)です。したがって、それぞれの改行は折り畳まれずそのまま残ります。この例で唯一上述の規則に当てはまるのはddd行の後の改行です。そのため、この改行は単一スペースに変換され、それ以外の改行はそのまま残ります。

ブロックコレクション

コレクションのシーケンスとマッピングにも、それぞれにブロックスタイルの記法があります。ブロックコレクションの内側ではフロースタイルを使用することもできます(その反対はできません)。

ブロックシーケンス

シーケンスは順序づけられたデータのコレクションです。ブロックシーケンスは各要素は行頭の「-」インジケータで示され、それぞれ独立した行に記述します。「-」もインデントの一部です。「-」と要素はホワイトスペースで分離する必要があります。

-.one↓
-.two↓
-.three↓
=> ['one', 'two', 'three']

要素には任意のブロックスタイルも使用できます。また要素は完全に空でも構いません。

-.|↓
..block scalar↓
-
=> ['block scalar\n', None]

要素がブロックコレクションの場合は、コンパクトな記法を使用できます。この場合「-」インジケータとそれに続くスペースの両方が、ネストされたコレクションのインデントの一部と見なされます。

- - one   # ネストしたシーケンスのコンパクト記法
  - two
- one: 1  # ネストしたマッピングのコンパクト記法
  two: 2
=> [['one', 'two'], {'one': 1, 'two': 2}]

ブロックマッピング

キーは「?」インジケータで示され、値は「:」インジケータで示されます。「?」とキー、「:」と値の間にはホワイトスペースを置いて分離する必要があります。

「?」は省略可能です。その場合、キーは1行で記述する必要があります。

one: 1 
two: 2
=> {'one': 1, 'two': 2}

「?」を明示的に指定する場合、「: 値」は別の行に置く必要があります。「?」を指定した場合、キーは1行に制限されませんので、複雑なキーを記述することができます。

? "one
   two"
: 12
? "three
   four"
: 24
=>  {'one two': 12, 'three four': 24}

データ型の解決

YAMLのデータは、YAML処理系によってプログラミング言語のネイティブなデータ型にマッピングされます。データにタグを指定して明示的に型情報を示すことができます。タグがないデータはルールに従ってネイティブなデータ型にマッピングされます。

タグはTAGディレクティブによって新しく定義することもできますが、高度な話題なのでこの記事で説明は省きます。ここではデフォルトで定義されているタグについて説明します。

タグ

YAMLでは以下のタグが定義されています。YAMLのバージョンや処理系によってはこれ以外のタグが使用できる場合があります。それらについては、それぞれのドキュメントを確認してください。

以下に示すタグは、ほぼ間違いなくいかなる環境でも使用できます。

タグタグが表すデータ型の意味
!!seq0から始まる整数でインデックス付けられた順序を持つコレクションを表す。Pythonのリスト、Javaの配列などにバインドされる。
!!mapキーを値にマッピングする連想コンテナを表す。Pythonの辞書、Javaのハッシュテーブルなどにバインドされる。
!!strUnicode文字列を表す。プログラミング言語の文字列型にバインドされる。
!!int任意のサイズの整数を表します。プログラミング言語の整数型へバインドされます。
!!float浮動小数点数を表します。正の無限大、負の無限大、非数の3つの特別な値も含まれます。プログラミング言語の浮動小数点数型へバインドされます。
!!bool真偽値を表します。プログラミング言語の真偽値型へバインドされます。
!!null値が存在しないことを表します。プログラミング言語のヌル値のようなデータがにバインドされます。Pythonの場合はNoneです。

これらのタグを指定したときに、プログラミング言語のどのデータ型にマッピングされるかは、YAML処理系のドキュメントを確認する必要があります。

以下にデータへタグを指定した例を示します。

- !!str 123
- !!int "123"
- !!float "3.14"
- !!null "null"
=> ['123', 123, 3.14, None]

タグなしデータのデータ型解決

YAMLでは、タグが関連付けられていないデータは、タグ解決のルールに従ってネイティブなデータ型にマッピングされます。タグ解決のルールには正規表現のリストとの照合も含まれます。これは最初にマッチした正規表現のデータ型へマッピングされます。

YAML処理系によって対応するタグ解決のレベルが異なることがあるので、詳しいルールについてはYAMLの仕様書および処理系のドキュメントを確認してください。

PyYAMLでYAMLのタグなしデータは、以下のようにPythonのデータ型へ変換されます。

str: foo
int: -12
float: 3.14
list: [1, 2, 3]
dict: {one: 1, two: 2}
none: [~, null]
bool: [true, false, on, off]
=>
{'str': 'foo',
 'int': -12,
 'float': 3.14,
 'list': [1, 2, 3],
 'dict': {'one': 1, 'two': 2},
 'none': [None, None],
 'bool': [True, False, True, False]}
PythonでYAMLを読み書きする方法 | Pythonマニア

ここでは以下の記事の例を引用しています。

アンカーとエイリアス

アンカーでデータをマークすると、後でそのデータをエイリアスで参照することができます。

アンカーは「&」インジケーターで示され、その後に名前が続きます。エイリアスは「*」インジケーターで示され、アンカーの名前を続けて参照します。

以下に例を示します。- &name1 one – &name2 two – *name1 – *name2 => [‘one’, ‘two’, ‘one’, ‘two’]

「&name1」と「&name2」でデータにアンカーして、そのデータを「name1」と「name2」で参照しています。

複雑なYAMLの記述例

最後に少し複雑なYAMLの記述例を見てみましょう。実際にYAMLを記述するときの参考になれば幸いです。

シーケンスのシーケンス

- [1, 2]
- [one, two]
=> [[1, 2], ['one', 'two']]

-
  - 1
  - 2
-
  - 3
  - 4
=> [[1, 2], [3, 4]]

- - 1
  - 2
- - 3
  - 4
=> [[1, 2], [3, 4]]

マッピングのシーケンス

-
  one: 1
  two: 2
-
  three: 3
  four: 4
=> [{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

- one: 1
  two: 2
- three: 3
  four: 4
=> [{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

マッピングのマッピング

foo: {one: 1, two: 2}
bar: {
  three: 3,
  four: 4,
}
=> {'foo': {'one': 1, 'two': 2}, 'bar': {'three': 3, 'four': 4}}

シーケンスへのマッピング

foo:
- 1
- 2
bar:
- one
- two
=> {'foo': [1, 2], 'bar': ['one', 'two']}

シーケンスのシーケンス

シーケンスのシーケンス

シーケンスのシーケンス

シーケンスのシーケンス

まとめ

行の折り畳みにクセがあり、記事が少し長くなってしまいましたが基本的な構文はとても簡単です。YAMLはAnsibleなどでも使われているので、マスターしておいて損はないと思います。

参考ドキュメント:

長くなりましたが、最後までご覧いただき、誠にありがとうございます。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

・PM、SE、SIなどを20年以上経験
・ネットワークスペシャリスト、セキュリティスペシャリストなど複数の資格を保有

目次