python/3ではINIファイルに特殊な形式が使える
INIファイルは、古典Windowsが3.1辺りから採用してる設定ファイルだが、形式が簡単で人間にも書きやすいので様々なOSやプログラムで活用されてる。
python3標準ライブラリには、INIファイルのパーザが組み込まれている。
configparser --- 設定ファイルのパーサー — Python 3.9.4 ドキュメント
このライブラリ群はpure pythonで書かれており、また主要機能は正規表現で処理されている。故にカスタマイズが非常に容易である。
セクションヘッダ SECTCRE
標準では次の値が設定されてる。
_SECT_TMPL = r"""
\[ # [
(?P<header>[^]]+) # very permissive!
\] # ]
"""
SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
書き換える場合は、group("header") を返す必要があるようだ。
何故か行末指定がないので、"[名]=値" のような値をセクション名として受け取ってしまう。
次のようにすると誤検出が少なくなるとおもわれる。
SECTCRE = re.compile(r'^\[(?P<header>[^]]+)\]$')
値の切り出し OPTCRE
標準では次の値が設定されている
_OPT_TMPL = r"""
(?P<option>.*?) # very permissive!
\s*(?P<vi>{delim})\s* # any number of space/tab,
# followed by any of the
# allowed delimiters,
# followed by any space/tab
(?P<value>.*)$ # everything up to eol
"""
OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
これを置きかえる場合には、group("option"), group("vi"), group("value") を返す必要がありそうだ。
しかし、SECTREほど簡単な話ではなく、OPT_TMPLでは上の通りdelimによりコンストラクタでの置換の余地を残している。
実際に書き換える場合
例えばキーと値の両方にクオートが使えるといろいろ指定の幅が広がるだろう。
実際には self.OPTCREが直接使われることはなく、configparser.__init__にて、self._optcreが作られる。故にOPTCREを書き換える場合は、configparserを継承して OPT_TMPLを差し替えたほうが上品であるとは言える。
さもなければ次の通りだ。
_optcre = OPTCRE = re.compile(
r'^(["\']?)(?P<option>(\1|.*))\1\s*(?P<vi>{delim})\s*(["\']?)(?P<value>.*)\5$'.format(
delim="=")
)
キー名の変換 optionxform
標準では、str.upper が動く。つまり大文字小文字を無視する。
これは、strインスタンスを引数にとってstrインスタンスを返すようなcallableを指定すれば良いので、そのままstrを代入してもよいだろう。
Discussion