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

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

を実装せねばなりません。

オプションが可変個の引数をとるようにさせたいなら、いくつかの 巧妙で厄介な問題に配慮しなければなりません。どういう実装を とるかは、アプリケーションでどのようなトレードオフを考慮するか によります (このため、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 の引数ではなく次の オプションとして解釈される(そしておそらくエラーを引き起こす) ということです。この問題の修正は読者の練習課題としておきます。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。