モジュール docutils.frontend¶
モジュール docutils.frontend について記す。ここにはコマンドライン処理クラス、構成ファイル読み込みクラス、およびそれらを援助するデータクラスと補助関数が実装されている。
クラス図¶
モジュール内で定義されている例外クラスを除いたクラス図を示す。Python 標準のクラスおよび説明済みのクラスはグレーアウトで表し、例えば例外クラスのような、本筋とは外れているクラスは省いている。
Docutils で Python 標準のクラスを継承しているモジュールはこれくらいしかない。
クラス Values¶
Python 標準の optparse.Values から派生したクラス。目的は、リスト属性を更新するときに、元のものを置き換えるのではなく、元のリストに追加するように振る舞いを変えることらしい。
メソッド
updateでそれを実現している。両者で共通するキーがあれば、それらを採用しないように項目を操作している。謎のメンバーデータ
self.record_dependenciesがある。これはクラスdocutils.utils.DependencyListの解読をやってからにしたい。
クラス Option¶
Python 標準の optparse.Option から派生したクラス。目的は validator と
overrides というオプションを追加すること。
メソッド
processを上書きして、それらの属性を受け入れるようにしてある。
クラス OptionParser¶
Python 標準の optparse.OptionParser と 基礎クラス群 で調べた
SettingsSpec の両方を継承したクラス。 Docutils がコマンドライン解析をするのに用いる。
クラス ConfigParser¶
Python 標準の configparser.RawConfigParser を継承したクラス。メソッド
read および optionxform は上書きで、メソッド handle_old_config,
validate_settings, get_section はこの派生クラスに固有のもの。
メソッド
readに至ってはシグニチャーをも上書きしている。引数にOptionParserオブジェクトを受け取るように改造してある。これがメソッドvalidate_settingsに渡り、オプション値の妥当性確認に機能する。メソッド
optionxformはたいへん分かりやすい上書きで、いわばオプション文字列の正規化をする。オプション文字列内にあるアルファベットは小文字に揃え、マイナス記号はアンダースコアに揃えるだけだ。メソッド
get_sectionはなぜか標準にない機能なので、仕方なしに実装したということではないだろうか。唯一「?」なのはメソッド
handle_old_configだ。これは構成ファイルにoptionsというセクションがある場合に、メソッドreadから呼び出される。処理内容は警告を表示して
generalというセクションに置き換えるというようなものらしい。想像するに Docutils の構成ファイルの仕様が過去のある時点で変更があって、それを救うために提供されているメソッドということなのかもしれない。
関数¶
関数
validate_xxxx系は、外部から受け取った設定値を可能な限り「正規化」して返し、どうしてもダメならば例外を送出するという方針で一貫している。関数
store_multipleは不明。コマンドラインオプション--no-source-linkが指定されたときに機能するらしい。関数
read_config_fileはコマンドラインオプション--configが指定されている場合、同時に指定さている文字列を構成ファイルのパスとみなして読み込む処理をする。関数
make_paths_absoluteおよびmake_one_path_absoluteは相対パスを絶対パスに変換する。 Python 標準のos.path.abspathとos.path.joinを利用している。関数
filter_settings_specはある設定値のコレクションを操作する。条件を与えて値を取り除いたり置き換えたりする、フィルターのような働きをする。限定された状況で利用する関数と見られる。
感想¶
ちょっとしたコマンドラインベースのプログラムを書くときにいつも考えるのは、コマンドライン引数の処理と構成ファイルの処理をどう上手く同居させるかということだ。ここで見てきた設計を丁寧に分析すれば、今後活きていくはずだ。
個人的には
optparseは全く利用せずにargparseでコマンドライン解析をするので、ここで用いられている技法を自作コードに採り入れるのは、わりと頭を使わねばならない。ConfigParserは旧形式の構成ファイルの変換と、オプション値の妥当性チェックという役割が特徴だというのならば、自分で何かプログラムを書くときには Python 標準のクラスをそのまま利用して十分だ。