今回は、Python用のライブラリとして、PyYAML、libyaml for Pythonの2つのライブラリを紹介します。
PyYAML
PyYAMLは、Pythonで実装されたYAMLライブラリです。特徴としては、YAMLの最新仕様に厳密に準拠していることです。そのため、現在ではYAMLにおけるリファレンス実装だとみなされています。
インストール
インストールは、LinuxやMac OS Xではリスト1の手順で行ってください。Windowsの場合は、http://pyyaml.org/download/pyyaml/にあるWindows installerを使ってください。
使い方
PyYAMLの使い方はリスト2のようになります。日本語を含む場合は必ずUnicodeにデコードしなければならない点に注意してください。詳細はリファレンスマニュアルを参照してください。
またYAMLでは任意のオブジェクトを変換/復元できます。しかしそのために、たとえば信用できない相手から受け取ったYAML文字列をそのままyaml.load()でロードすると、セキュリティ的に問題のあるデータに変換される可能性があります。これを防ぐために、PyYAMLでは次の関数が用意されています。
- yaml.safe_load()
- yaml.load()と同じですが、「!!python/object:__main__.Hello」のようなタグがあるとエラーになります。
- yaml.safe_dump()
- yaml.dump()と同じですが、listやmapやスカラー以外のオブジェクトがあるとエラーになります。
これらを使うと、安全なデータのみを相手と受け渡しできます。
タグを変更する
yaml.dump()でインスタンスオブジェクトをYAML文字列に変換した場合、たとえば「!!python/object:__main__.Color」のようなタグがつきます。しかしこれだとPython限定になり、ほかの言語のYAMLパーサで読み込むとエラーになるため、データ交換する場合には都合が悪いです。
これを回避するには、以下の関数を使ってクラスに対応するタグを指定します(リスト3)。
- yaml.add_representer(klass, func)
- オブジェクトをノード(yaml.nodes.Node)に変換する関数を登録します。
- yaml.add_constructor(ytag, func)
- ノード(yaml.nodes.Node)からオブジェクトを復元する関数を登録します。
またオブジェクトをマッピング以外のデータで表現することもできます。リスト4は、文字列またはシーケンスでデータを表現した例です。
日本語の扱い
yaml.load()では、入力となる文字列をデコードしてunicodeに変換しておけば、特に問題はありません。
yaml.dump()では、デフォルトでは日本語文字列がたとえば「\u3044」のようにエンコードされますが、allow_unicode=Trueを指定するとエンコードされません。またUnicodeを変換するためのencodingを指定できます。
その他
Pythonのlistオブジェクトやdictオブジェクトは、次のようなルールでYAMLのコンテナに変換されます(リスト5)。
- ほかのコンテナを含んでいればブロックスタイル
- ほかのコンテナを含んでいなければフロースタイル
フロースタイルを使わずすべてをブロックスタイルにしたい場合は、yaml.dump()においてdefault_flow_style=Falseを指定してください。
LibYAML for Python
LibYAMLは、Cで書かれた高速なライブラリです。LibYAML自体では動作せず、各プログラミング言語用のバインディングが必要です。今のところ、Python用のバインディングが用意されています。
インストール
LibYAMLのインストールは、リスト6の手順で行ってください。
またLibYAMLをPythonから使うには、Pythonバインディングが必要です。
インストールには、ほかにPyrexとPyYAMLが必要です(リスト7)。
使い方
LibYAMLをPythonから使う方法は、以下の点を除いてPyYAMLと同じです。
- yaml.load()において、引数に「Loader=CLoader」を指定する
- yaml.dump()において、引数に「Dumper=CDumper」を指定する
つまりPyYAML標準のLoaderクラスとDumperクラスの代わりに、LibYAML'を使ったCLoaderクラスとCDumperクラスを指定するわけです。
リスト8は使い方のサンプルです。ここではLibYAML'がインストールされていてもいなくても動作するようにしています。
日本語の扱い
日本語の扱いについては、PyYAMLと同じです。
タグを変更する
タグを変更する方法は、PyYAMLと同じです。
不具合
筆者が試した範囲では、特に不具合は見つかりませんでした。
その他
当然ですが、LibYAMLはC言語から使うことができます。詳細はlibyamlのWebサイトを参照してください。