When it’s ready.

出来るまで出来ない

Pythonで簡単に設定ファイルを使う。書き換え可能で、配列も辞書型も使う方法

Flaskがいい。やりたいことに最小手で辿り着ける。JS書いてる時間の方が長いくらい。
ちょいちょいいじってると不便だなぁって思うところは、標準の設定ファイルが無い
Djangoはsettings.pyが用意されてて適当に弄るだけで色々便利だった。Flaskに
限った話じゃないけどとりあえづ適当に、設定だけを記述して、利用する際には
そこだけ変更すればある程度対応できる用にしたい。という事が多々ある。

設定ファイルあれこれ

設定をファイルに書き出すにはどんなのがあるかと思いつく限りでは

読み込み専用だったらconf.pyとかにして、importすればいい
  • Python書式に従う必要がある
  • 書き換えが出来ない(やり方が判らない)
オレオレ設定ファイルフォーマットを作ってファイルの読み込めば出来る
  • パーサーとか毎回書くのめんどい
  • 汎用性がない(再発明とかしたくない)
読み書き出来て便利そうなConfigParserという便利そうなのがあるが
  • 配列を記録できない
  • 辞書型を記録できない

ConfigParserを使うのが筋?

出来ないことは出来るようにしちゃえばいいじゃないかと、リストとかDictを文字で書き出して、evalして読み込むようにしちゃってみた。
もともと、RFCに無いぽいので出来ないだけで出来たほうが全然嬉しいと思うんだけど・・・
そう言うのはセクションレベルでやれということなのかな?

とりあえづ、'{' か '[' で始まってたらというメチャいい加減な判定でevalするようにしただけ。

#!/usr/bin/env python
# coding:utf-8

from ConfigParser import SafeConfigParser
import os, sys

class AppConfig:
  # このファイルと同じディレクトリのconfigというファイルを使用
  def __init__(self):
    self.parser = SafeConfigParser({'Section':'value'})
    self.configfile = os.path.join(os.path.dirname(__file__), "config.conf")
    try:
      f_in = open(self.configfile, "r")
      self.parser.readfp(f_in)
      f_in.close()
    except IOError:
      # 設定ファイルが読めない場合、作成を試みる
      try:
        f_out = open(self.configfile, "w")
      except IOError:
        # 書けなかったら終了
        print >> sys.stderr, "Error: cannot write file:", self.configfile
        sys.exit(1)
      # 初期設定を書き込む
      self.parser.write(f_out)
      f_out.close()

  def getConfig(self, sect, param):
    # 値の表示
    ret = self.parser.get(sect, param)
    if '[' == ret[0] or '{' == ret[0]:
      return eval(ret)
    else:
      return ret
 
  def setConfig(self, sect, param, val):
    # 値の操作(セクション名/名前/値)
    if self.parser.has_section(sect):
      self.parser.set(sect, param, "%s"%(val))
    else:
      self.parser.add_section(sect)
      self.parser.set(sect, param, "%s"%(val))

    # 新しい設定を書き込む
    try:
      f_out = open(self.configfile, "w")
    except IOError:
      print >> sys.stderr, "Error: cannot write file:", self.configfile
      sys.exit(1)
    self.parser.write(f_out)
    f_out.close()

if __name__ == '__main__':
  conf = AppConfig()
  # 新規に要素追加
  conf.setConfig('HOGE', 'test', [1,2,3])
  # 追加した要素の読み込み
  print conf.getConfig('HOGE', 'test')[0]

今のままだと、セクションを消したり出来ない。消したいときは直接ファイルをいじればいいやと割り切り
あと、読み書きするとセクション内の順番がバラバラになっちゃう。
Python3で順番維持のDictが使えるようになるらしいので、順番の入れ替わりはなくなるんじゃないかと・・・

もっと簡単に、設定ファイルを外出しして読み書き可能な方法ってなんだろ?