あるオプションに可変個の引数を持たせたいと考えているなら、問題はいささか手強く
なってきます。この場合、optparse では該当する組み込みのオプション解析
機能を提供していないので、自分でコールバックを書かねばなりません。さらに、
optparse が普段処理している、伝統的な Unix コマンドライン解析における
難題を自分で解決せねばなりません。とりわけ、コールバック関数では
引数が裸の"-" や "-" の場合における慣習的な処理規則:
"-" or "-" can be option arguments
"-" (何らかのオプションの引数でない場合): コマンドライン処理を
停止し、"-"を無視します。
"-" (何らかのオプションの引数でない場合): コマンドライン処理を停止しますが、
"-" は残します (parser.largs に追加します)。
を実装せねばなりません。
オプションが可変個の引数をとるようにさせたいなら、いくつかの 巧妙で厄介な問題に配慮しなければなりません。どういう実装を とるかは、アプリケーションでどのようなトレードオフを考慮するか によります (このため、optparse では可変個の引数に 関する問題を直接的に取り扱わないのです)。
とはいえ、可変個の引数をもつオプションに対するスタブ (stub、仲介 インタフェース) を以下に示しておきます:
def vararg_callback(option, opt_str, value, parser):
assert value is None
done = 0
value = []
rargs = parser.rargs
while rargs:
arg = rargs[0]
# "--foo", "-a", "-fx", "--file=f" といった引数で停止。
# "-3" や "-3.0" でも止まるので、オプションに数値が入る場合には
# それを処理せねばならない。
if ((arg[:2] == "--" and len(arg) > 2) or
(arg[:1] == "-" and len(arg) > 1 and arg[1] != "-")):
break
else:
value.append(arg)
del rargs[0]
setattr(parser.values, option.dest, value)
[...]
parser.add_option("-c", "--callback",
action="callback", callback=varargs)
この実装固有の弱点は、-c 以後に続いて負の数を表す 引数があった場合、その引数は-c の引数ではなく次の オプションとして解釈される(そしておそらくエラーを引き起こす) ということです。この問題の修正は読者の練習課題としておきます。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。