[Python-Dev] PEP 389: argparse - new command line parsing module

Robert Kern robert.kern at gmail.com
Wed Sep 30 23:01:32 CEST 2009


On 2009-09-30 15:17 PM, Andrew McNabb wrote:
> On Wed, Sep 30, 2009 at 02:22:53PM -0400, Barry Warsaw wrote:
>>
>> Right.  I've made it kind of work in Mailman 3, but it would be nice for
>> argparse to support this out of the box.  Note that I think you want two
>> forms:
>>
>> foo help subcommand
>> foo subcommand --help
>>
>> to basically print the same help text.  This is the way bzr does it for
>> example and it works great.
>
> In some commands, options as well as subcommands can change subsequent
> parsing.  The iptables command is a good example of a command-line
> program that follows this practice.  From the man page:
>
>    after [a module name is specified], various extra command line options
>    become available, depending on the specific module.  You can specify
>    multiple extended match modules in one line, and you can use the -h or
>    --help options after the module has been specified to receive help
>    specific to that module.
>
> In the case of iptables, module names are specified as options, not as
> subcommands.
>
>> From my cursory reading of the documentation, it looks like argparse can
> only add subparsers for subcommands.  Is there any way to add subparsers
> based on options instead (as iptables does)?

I have not done so, but I suspect so. The implementation of .add_subparsers() 
adds to the positional argument list, but one could be written to append to the 
option list.

> Also, is it possible to add these subparsers dynamically?  For example,
> you would want to be able to load a module immediately after parsing the
> name instead of having to keep a predetermined list of all module names.
> I'm pretty sure that bzr dynamically loads modules this way.  Can
> argparse help with this?

Not out-of-box, but it looks fairly straightforward to plug in. The subparser 
logic is mostly encapsulated in the _SubparsersAction class. You can register a 
new class for it:

     parser.register('action', 'parsers', MySubParsersAction)

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco



More information about the Python-Dev mailing list