雑談
お久しぶりです。9月から諸事情で活動全般が停滞してまして、ブログもさっぱり放置していました。
Twitterなどなどは精力的に更新していましたが、ブログを書くとなるとちょっと体力いるなあと感じてしまってます。
ブログのネタはたくさんありまして、Evernoteにはたくさんのドラフトな記事がありますので、少しずつですがアップしていこうと思います。
本題
ちょっと前にPythonで設定ファイルを扱いたいときに、どういった形式をどういったモジュールで扱えるのかを箇条書きしたりしたメモです。
Python界隈では様々なモジュールがありますので、これのまとめが一概に言えるものではないのですが、あまりまとまった記事がなかったような気がするので上げてみようと思います。
(Python公式でまとめられていた、ConfigParserShootoutの劣化版な感じでもあります。jsonとかyamlはないしまあいいかなと)
https://wiki.python.org/moin/ConfigParserShootout
なんで調べたの?
GUIの設定ファイルを書くとき、ファイルをコンバートするような処理の時に、プロファイル定義を複数用意したかった時に悩んだので。
何が問題になるか
- 書きやすいか
- 複数の値を持てるか
- 複雑な構造(入れ子構造や行列とか)は作りやすいか
- プロファイル的なものを管理するときに、1ファイルオンリーでやる場合は必要
- 複数ファイル(conf.d的なディレクトリ)を使うならその限りではないと思う
設定ファイルにはどんなものがあるか?
ini
- Winでよく見たりするけどLinuxのconfファイル系でも結構見る
- セクションでカテゴリーにして、オプション名とバリューで設定を定義
- 基本的に、[セクション] -> オプション = バリュー
- よく使われるけど、仕様は厳密に定義されていない
- セクションの入れ子構造としてサブセクションというのがあるらしい
- パーサーによっては対応できない場合がある
- Pythonで使えるパーサーはConfigPerser
- 標準モジュール
- http://docs.python.jp/2/library/configparser.html
- http://docs.python.jp/3.3/library/configparser.html
- ConfigObj:https://github.com/DiffSK/configobj
- http://configobj.readthedocs.org/en/latest/
- ConfigPerserより高機能らしい
- サブセクションを使える
- かなり拡張されているっぽいので、昔ながらのiniに慣れている人には馴染めないかも
xml
- マークアップ系、タグ名は自分で定義できる
- 人が書くものではないぐらい面倒
- 自動生成させて構造をもたせるときには便利
- コメント書ける。けど面倒だよ><(htmlなコメント出し、コメントタグの定義もいいかもしれないけど)
- Pythonで扱えるモジュールについては割愛
json
- http://www.json.org/
- javascriptで使われていたもの
- そのままjavascriptでparseできる
- http://tools.ietf.org/html/rfc4627
- 最近ナウいものによく使われる
- RestFulなAPIが返す値はJSONが多いし
- Sublime Textあたりの、ソフトウェア側でもよく見るし
- コメント書けない
- http://monmon.hatenablog.com/entry/2013/12/20/151321
- Pythonの標準モジュール
- json
- Relaxed JSONというものもある
- コメント書けるらしい
- PythonだとRSONというモジュールがそれらしいかも知れないけど、ちょっと違うかも・・・(Yamlの構文も扱える?
- 13日の金曜日の映画と間違える(じぇいs。。。すみません。
yaml
- http://www.yaml.org/
- バージョンは1.0, 1.1(現行よく使われてる?), 1.2(最新版、処理系まだ見ない?)
- インデントでネストできる
- リストやハッシュ(pythonで言う辞書)があって書き方がちょっとpython的
- 順序付きのハッシュ(!!omap, !!pair)も利用可能だった。便利です
- ただし、読み込み/書き出しを行う時、書き出ししたものが、元の読み込みで書いた構造通りのものにはならない
- (冗長な書き方/人間的にわかりやすい書き方をしても、設定として保存すると、それが失われる)
- (そうなのかどうか、まだよくわかってないけど、)
- コメントの保持する方法がわからなかった
- 書き出すときの設定はあるので、設定次第かも
- 基本的に人が見る設定は読み込みのみにした方がいいかも。
- JSONと同じ、シリアライズ/デシリアライズする形式
- Pythonモジュール
- PyYaml
- http://pyyaml.org/wiki/PyYAML
- YMALのリファレンス実装
- a complete YAML 1.1 parser. In particular, PyYAML can parse all examples from the specification. The parsing algorithm is simple enough to be a reference for YAML parser implementors. (公式引用)
- http://gihyo.jp/dev/serial/01/yaml_library/0003
まとめ
調べての感想ですが
- iniは一般的に、セクションというブロックないで、キーバリュー単純な形式で、書きやすいと思われる。
- jsonやymalはプログラム側のデータオブジェクトにできる、書き出せる。シリアライズ/デシリアライズ
- jsonはjavascriptがわかっていれば書きやすい
- yamlはちょっと立ち位置がわからなかった。だれか教えて
- xmlは値の意味や指示を厳密に定義できる。
- Pythonで扱うなら
- intならお手軽なConfigPerser
- データ型を当てたり変換が面倒な場合はjsonやymalを扱うほうがいいかも。
- jsonは標準モジュールなのですぐに利用できる
- pickleも直列化をするモジュールだが、データやオブジェクトをdumpしたいときにしたほうがいいと思う
- http://docs.python.jp/2/library/pickle.html
- http://docs.python.jp/3.3/library/pickle.html
- yamlは色々と使われているところが多いように思う(個人談、最近のツールでもよく見るし)し、Pythonでの処理系が公式の処理系なので安心感はある。
- XMLは標準で入ってるElementTreeで良いかも(XMLは今回は確認してないのであんまり調べてない)
後で調べたもの
- apacheのvirtualhostの書き方をパースできるものってあるか調べてみたけど、ZConfigというモジュールがそれらしいです
- https://pypi.python.org/pypi/ZConfig
終わりに
これ調べたの半年前なので、現在はいろいろ変わってるかもしれませんのであしからず。 今のところ、書きやすく使いやすいYAMLを利用しています。コメント書けるので色々と便利なのです。
もともと、プロファイルをまとめて保存するために構造を作りやすい/描きやすい設定ファイルの形式を探したのですが、サーバー系でもよくある、conf.dディレクトリでファイル単位でプロファイルを分ければ、iniでもyamlでもなんでも良いような気がしています。実装もそんなに苦労しないだろうし。(そういうモジュールもあるんだろうか?)
後これは12月にあるshizuoka.pyのネタにしたいと思います。(なので忘れる前に整形して出しておきました(汗)