14.3.5.2 新しいアクションの追加

新しいアクションの追加はもう少しトリッキーです。というのも optparse が使っている二つのアクションの分類を理解する必要があるからです。

``store'' アクション
optparse が値を現在の OptionValues の属性に格納することになるアクションです。 この種類のオプションは Option のコンストラクタに dest 属性を与えることが 要求されます。
``typed'' アクション
コマンドラインから引数を受け取り、それがある型であることが期待されているアクションです。 もう少しはっきり言えば、その型に変換される文字列を受け取るものです。 この種類のオプションは Option のコンストラクタに type 属性を与えることが 要求されます。

この分類には重複する部分があります。デフォルトの ``store'' アクションには storestore_constappendcount などがありますが、 デフォルトの ``typed'' オプションは storeappendcallback の三つです。

アクションを追加する際に、以下の Option のクラス属性(全て文字列のリストです) の中の少なくとも一つに付け加えることでそのアクションを分類する必要があります。

ACTIONS
全てのアクションは ACTIONS にリストされていなければなりません
STORE_ACTIONS
``store'' アクションはここにもリストされます
TYPED_ACTIONS
``typed'' アクションはここにもリストされます
ALWAYS_TYPED_ACTIONS
型を取るアクション (つまりそのオプションが値を取る) はここにもリストされます。 このことの唯一の効果は optparse が、型の指定が無くアクション が ALWAYS_TYPED_ACTIONS のリストにあるオプションに、 デフォルト型 string を割り当てるということだけです。

実際に新しいアクションを実装するには、Option の take_action() メソッドをオーバライドしてそのアクションを認識する場合分けを追加しなければなりません。

例えば、extend アクションというのを追加してみましょう。このアクションは 標準的な append アクションと似ていますが、コマンドラインから一つだけ値を 読み取って既存のリストに追加するのではなく、複数の値をコンマ区切りの文字列として 読み取ってそれらで既存のリストを拡張します。すなわち、もし "-names"string 型の extend オプションだとすると、次のコマンドライン

--names=foo,bar --names blah --names ding,dong

の結果は次のリストになります。

["foo", "bar", "blah", "ding", "dong"]

再び Option のサブクラスを定義します。

class MyOption (Option):

    ACTIONS = Option.ACTIONS + ("extend",)
    STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
    ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)

    def take_action(self, action, dest, opt, value, values, parser):
        if action == "extend":
            lvalue = value.split(",")
            values.ensure_value(dest, []).extend(lvalue)
        else:
            Option.take_action(
                self, action, dest, opt, value, values, parser)

注意すべきは次のようなところです。

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