Argparse: How to accept arguments that have different "types"

argparse, python, python-3.3

Solution

you want

parser.add_argument('-r', type=revs, ...)

not

parser.add_argument('-r', type='revs', ...)

The `type` argument must be a callable object -- since strings aren't callable, they can't be used as the `type`.

Problem

I want to accept arguments in the following style: ``` python3 test.py -r SERVICE=100,101,102 -r SERVICE2=1,2,3,4,5 (-r REPO=REV#,REV#,etc... -r etc...) ``` I've done the following so far (added the argument -r and defined the type revs). It's supposed to pass back two lists, which may be problematic. ``` import argparse def revs(s): try: REPO, REVISIONS = map(str, s.split('=')) REVISIONS = map(int, REVISIONS.split(',')) return REPO, REVISIONS except: raise argparse.ArgumentTypeError("Must be format -r REPO=REV,REV,etc.. e.g. SERVICES=181449,181447") parser.add_argument('-r', type='revs', nargs='*', action='append', help='Revisions to update. The list is prefixed with the name of the source repository and a "=" sign. This parameter can be used multiple times.', required=True) ``` I get the following error when running with the above: ``` Traceback (most recent call last): File "test.py", line 11, in <module> parser.add_argument('-r', type='revs', nargs='*', action='append', help='Revisions to update. The list is prefixed with the name of the source repository and a "=" sign. This parameter can be used multiple times.', required=True) File "/usr/local/lib/python3.3/argparse.py", line 1317, in add_argument raise ValueError('%r is not callable' % (type_func,)) ``` ValueError: 'revs' is not callable

Original source