Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python argparse: metavar and action=store_true together

I'm using argparse module in Python to parse parameters typed in a command line interface. I have the following add_argument call to a subparser object:

submit_parser.add_argument('-pv','--provision',metavar='PROVISION', dest='PROVISION',
                                 help='provision system',
                                 action='store_true', default=False, required=False)

I get this error:

Traceback (most recent call last):
  File "./scripts/tp4", line 94, in <module> 
    main()
  File "./scripts/tp4", line 74, in main 
    modloader.loadModules(sub_parsers)
  File "/usr/lib/python2.6/site-packages/tp4/cli/Moduleloader.py", line 66, in loadModules 
    registered_modules[module_name].setSubparserArgs(module_sub_parser)
  File "/usr/lib/python2.6/site-packages/tp4/cli/modules/AutotestModule.py", line 135, in setSubparserArgs
    action='store_true', default=False, required=False)
  File "/usr/share/tp4/cli/zip/argparse.zip/argparse.py", line 1302, in add_argument
    TypeError: __init__() got an unexpected keyword argument 'metavar'

If I remove action or metavar parameters, it works. Why both can't be together? There is nothing about this restriction in argparse documentation at http://docs.python.org/dev/library/argparse.html.

Thanks in advance for any help

like image 377
Alan Evangelista Avatar asked Aug 17 '12 03:08

Alan Evangelista


2 Answers

To extract an answer from @pwc, you need to use dest instead of metavar.

like image 120
asmeurer Avatar answered Sep 25 '22 21:09

asmeurer


A metavar only makes sense for positional arguments (think filenames at the end of the command line) or for when an argument takes arguments of its own (like --input-files foo.txt bar.txt).

Your --provision argument is a flag because you set the action to store_true. It doesn't take any arguments (i.e., nargs isn't set). As such, it doesn't make sense to have a metavar.

From the argparse documentation:

When ArgumentParser generates help messages, it need some way to refer to each expected argument. By default, ArgumentParser objects use the dest value as the “name” of each object. By default, for positional argument actions, the dest value is used directly, and for optional argument actions, the dest value is uppercased. So, a single positional argument with dest='bar' will be referred to as bar. A single optional argument --foo that should be followed by a single command-line argument will be referred to as FOO.

like image 38
pwc Avatar answered Sep 23 '22 21:09

pwc