アクションの追加は少しだけ厄介です。というのは、optparse がアクションを二種類に分類していることを理解しなければならないからです:
デフォルトの ``store'' アクションには、``store''、 ``store_const''、 ``append''、および ``count'' があります。デフォルトの ``typed'' アクションは、``store''、 ``append''、および ``callback'' です。
アクションを追加する際、 アクションが ``store''、``typed''、 どちらでもない、両方である、のいずれか決めなければなりません。 Option (または Option サブクラス) の3つのクラス属性 がこの決定を制御します:
自前の新たなアクションを実際に実装するには、Option の take_action() メソッドを上書きして、自前のアクションを 認識する場合を追加しなければなりません。
例として、``extend'' アクションを追加してみましょう。このアクションは 標準の ``append'' アクションに似ていますが、コマンドラインから単一の 値をとって既存のリストに追加する代わりに、 ``extend'' では コンマで区切られた単一の文字列から複数の値をとり、既存のリストに 追加します。すなわち、--names が ``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",) 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)
以下のことに注意します:
values.ensure_value(attr, value)
values の attr 属性が存在しないか、または None の 場合、ensure_value() は属性の値を value に設定して から value を返します。この機能は ``extend''、 ``append''、 および ``count'' で便利です。というのは、これらのアクションは すべて、データを変数に蓄積し、その変数が特定の型であるはず (最初の二つはリストで、最後の一つは整数) だからです。 ensure_value() を使うことで、アクションを使う スクリプトにおいて、オプションの目的変数にデフォルトの値を設定 するよう配慮しなくてよくなります; こうした目的変数はデフォルトを None にしておいてよく、ensure_value() が必要なときに 正しい値にするよう面倒を見ることになります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。