pythonで設定ファイルを使うときに何を使えばいいのか。をメモっただけの記事

2014-10-26(Sun) python

雑談

お久しぶりです。9月から諸事情で活動全般が停滞してまして、ブログもさっぱり放置していました。

Twitterなどなどは精力的に更新していましたが、ブログを書くとなるとちょっと体力いるなあと感じてしまってます。

ブログのネタはたくさんありまして、Evernoteにはたくさんのドラフトな記事がありますので、少しずつですがアップしていこうと思います。

本題

ちょっと前にPythonで設定ファイルを扱いたいときに、どういった形式をどういったモジュールで扱えるのかを箇条書きしたりしたメモです。

Python界隈では様々なモジュールがありますので、これのまとめが一概に言えるものではないのですが、あまりまとまった記事がなかったような気がするので上げてみようと思います。

(Python公式でまとめられていた、ConfigParserShootoutの劣化版な感じでもあります。jsonとかyamlはないしまあいいかなと)
https://wiki.python.org/moin/ConfigParserShootout

なんで調べたの?

GUIの設定ファイルを書くとき、ファイルをコンバートするような処理の時に、プロファイル定義を複数用意したかった時に悩んだので。

何が問題になるか

  • 書きやすいか
  • 複数の値を持てるか
  • 複雑な構造(入れ子構造や行列とか)は作りやすいか
    • プロファイル的なものを管理するときに、1ファイルオンリーでやる場合は必要
    • 複数ファイル(conf.d的なディレクトリ)を使うならその限りではないと思う

設定ファイルにはどんなものがあるか?

ini

xml

  • マークアップ系、タグ名は自分で定義できる
  • 人が書くものではないぐらい面倒
  • 自動生成させて構造をもたせるときには便利
  • コメント書ける。けど面倒だよ><(htmlなコメント出し、コメントタグの定義もいいかもしれないけど)
  • Pythonで扱えるモジュールについては割愛

json

yaml

  • http://www.yaml.org/
  • バージョンは1.0, 1.1(現行よく使われてる?), 1.2(最新版、処理系まだ見ない?)
  • インデントでネストできる
  • リストやハッシュ(pythonで言う辞書)があって書き方がちょっとpython的
  • 順序付きのハッシュ(!!omap, !!pair)も利用可能だった。便利です
  • ただし、読み込み/書き出しを行う時、書き出ししたものが、元の読み込みで書いた構造通りのものにはならない
    • (冗長な書き方/人間的にわかりやすい書き方をしても、設定として保存すると、それが失われる)
    • (そうなのかどうか、まだよくわかってないけど、)
    • コメントの保持する方法がわからなかった
    • 書き出すときの設定はあるので、設定次第かも
    • 基本的に人が見る設定は読み込みのみにした方がいいかも。
  • JSONと同じ、シリアライズ/デシリアライズする形式
  • Pythonモジュール

まとめ

調べての感想ですが

  • 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のネタにしたいと思います。(なので忘れる前に整形して出しておきました(汗)