argparse -- mutually exclusive sets of arguments?

Ian Kelly ian.g.kelly at
Sat Nov 24 02:07:46 CET 2012

On Fri, Nov 23, 2012 at 11:46 AM, Roy Smith <roy at> wrote:
> My command either takes two positional arguments (in which case, both
> are required):
> $ command foo bar
> or the name of a config file (in which case, the positional arguments
> are forbidden):
> $ command --config file
> How can I represent this with argparse; add_mutually_exclusive_group()
> isn't quite the right thing.  It could specify that foo and --config are
> mutually exclusive, but not (as far as I can see) the more complicated
> logic described above.

I don't think you could even do the former.  An argument must be
optional in order to be mutually exclusive with anything.  This works,

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--config', type=file)
    group.add_argument('--foobar', nargs=2, metavar=('FOO', 'BAR'))
    print parser.parse_args()

Downsides are that the resulting interface is a little more formal and
a little less friendly, and unless you customize the action you'll
wind up with a 2-element 'foobar' arg instead of separate 'foo' and
'bar' args.

More information about the Python-list mailing list