あるオプションに可変個の引数を持たせたいと考えているなら、問題はいささか手強く
なってきます。この場合、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"
の引数ではなく次の
オプションとして解釈される(そしておそらくエラーを引き起こす)
ということです。この問題の修正は読者の練習課題としておきます。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。