Adding new actions is a bit trickier, because you have to understand that optparse has a couple of classifications for actions:
Some default ``store'' actions are store, store_const, append, and count. The default ``typed'' actions are store, append, and callback.
When you add an action, you need to decide if it's a ``store'' action, a ``typed'', neither, or both. Three class attributes of Option (or your Option subclass) control this:
In order to actually implement your new action, you must override Option's take_action() method and add a case that recognizes your action.
For example, let's add an ``extend'' action. This is similar to the standard ``append'' action, but instead of taking a single value from the command-line and appending it to an existing list, ``extend'' will take multiple values in a single comma-delimited string, and extend an existing list with them. That is, if --names is an ``extend'' option of type string, the command line:
--names=foo,bar --names blah --names ding,dong
would result in a list:
["foo", "bar", "blah", "ding", "dong"]
Again we define a subclass of 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)
Features of note:
values.ensure_value(attr, value)
If the attr attribute of values doesn't exist or is
None
, then ensure_value() first sets it to value, and
then returns value. This is very handy for actions like
``extend'', ``append'', and ``count'', all of which accumulate data in
a variable and expect that variable to be of a certain type (a list
for the first two, an integer for the latter). Using
ensure_value() means that scripts using your action don't
have to worry about setting a default value for the option
destinations in question; they can just leave the default as None
and
ensure_value() will take care of getting it right when it's
needed.
See About this document... for information on suggesting changes.