I'm trying to write a script that accepts multiple input sources and does something to each one. Something like this
./my_script.py \
-i input1_url input1_name input1_other_var \
-i input2_url input2_name input2_other_var \
-i input3_url input3_name
# notice inputX_other_var is optional
But I can't quite figure out how to do this using argparse
. It seems that it's set up so that each option flag can only be used once. I know how to associate multiple arguments with a single option (nargs='*'
or nargs='+'
), but that still won't let me use the -i
flag multiple times. How do I go about accomplishing this?
Just to be clear, what I would like in the end is a list of lists of strings. So
[["input1_url", "input1_name", "input1_other"],
["input2_url", "input2_name", "input2_other"],
["input3_url", "input3_name"]]
This is simple; just add both
action='append'
andnargs='*'
(or'+'
).Then when you run it, you get
Here's a parser that handles a repeated 2 argument optional - with names defined in the
metavar
:This does not handle the
2 or 3 argument
case (though I wrote a patch some time ago for a Python bug/issue that would handle such a range).How about a separate argument definition with
nargs=3
andmetavar=('url','name','other')
?The tuple
metavar
can also be used withnargs='+'
andnargs='*'
; the 2 strings are used as[-u A [B ...]]
or[-u [A [B ...]]]
.-i
should be configured to accept 3 arguments and to use theappend
action.To handle an optional value, you might try using a simple custom type. In this case, the argument to
-i
is a single comma-delimited string, with the number of splits limited to 2. You would need to post-process the values to ensure there are at least two values specified.For more control, define a custom action. This one extends the built-in
_AppendAction
(used byaction='append'
), but just does some range checking on the number of arguments given to-i
.