###
9 コールバックの例6: 可変個の引数

あるオプションに可変個の引数を持たせたいと考えているなら、問題はいささか手強く なってきます。この場合、`optparse` では該当する組み込みのオプション解析 機能を提供していないので、自分でコールバックを書かねばなりません。さらに、 `optparse` が普段処理している、伝統的な Unix コマンドライン解析における 難題を自分で解決せねばなりません。とりわけ、コールバック関数では 引数が裸の`"-"` や `"-"` の場合における慣習的な処理規則:

- either `"-"` 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 の引数ではなく次の オプションとして解釈される(そしておそらくエラーを引き起こす) ということです。この問題の修正は読者の練習課題としておきます。