新しい型を追加するためには、optparse の Option クラスのサブクラスを 自身で定義する必要があります。このクラスには optparse における型を定義する 一対の属性があります。それは TYPES と TYPE_CHECKER です。
TYPES は型名のタプルです。新しく作るサブクラスでは、 タプル TYPES は単純に標準的なもののを利用して定義すると良いでしょう。
TYPE_CHECKER は辞書で型名を型チェック関数に対応付けるものです。 型チェック関数は以下のような引数をとります。
def check_mytype(option, opt, value)
ここで option は Option のインスタンスであ
り、opt はオプション文字列(たとえ
ば "-f")で、value は望みの型としてチェックされ変換される
べくコマンドラインで与えられる文字列です。check_mytype() は想
定されている型 mytype のオブジェクトを返さなければなりません。型
チェック関数から返される値は OptionParser.parse_args() で返
されるOptionValues インスタンスに収められるか、またはコールバック
に value パラメータとして渡されます。
型チェック関数は何か問題に遭遇したら OptionValueError を送出しなければなりません。
OptionValueError は文字列一つを引数に取り、それはそのまま OptionParser の
error() メソッドに渡され、そこでプログラム名と文字列 "error:"
が前置されてプロセスが終了する前に stderr に出力されます。
馬鹿馬鹿しい例ですが、Python スタイルの複素数を解析する complex オプション型
を作ってみせることにします。(optparse 1.3 が複素数のサポートを
組み込んでしまったため以前にも増して馬鹿らしくなりましたが、気にしないでください。)
最初に必要な import 文を書きます。
from copy import copy from optparse import Option, OptionValueError
まずは型チェック関数を定義しなければなりません。 これは後で(これから定義する Option のサブクラスの TYPE_CHECKER クラス属性 の中で)参照されることになります。
def check_complex(option, opt, value):
try:
return complex(value)
except ValueError:
raise OptionValueError(
"option %s: invalid complex value: %r" % (opt, value))
最後に Option のサブクラスです。
class MyOption (Option):
TYPES = Option.TYPES + ("complex",)
TYPE_CHECKER = copy(Option.TYPE_CHECKER)
TYPE_CHECKER["complex"] = check_complex
(もしここで Option.TYPE_CHECKER に copy() を適用しなければ、 optparse の Option クラスの TYPE_CHECKER 属性をいじってしまう ことになります。Python の常として、良いマナーと常識以外にそうすることを止めるものは ありません。)
これだけです! もう新しいオプション型を使うスクリプトを他の optparse に基づいた スクリプトとまるで同じように書くことができます。ただし、 OptionParser に Option でなく MyOption を使うように指示しなければなければなりません。
parser = OptionParser(option_class=MyOption)
parser.add_option("-c", type="complex")
別のやり方として、オプションリストを構築して OptionParser に渡すという方法もあります。 add_option() を上でやったように使わないならば、OptionParser に どのクラスを使うのか教える必要はありません。
option_list = [MyOption("-c", action="store", type="complex", dest="c")]
parser = OptionParser(option_list=option_list)
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。