Carl Banks wrote: > Is it possible to specify a zero-length switch? Here's what I mean. > > I have a use case where some users would have to enter a section name on > the command line almost every time, whereas other users (the ones using > only one section) will never have to enter the section name. I don't want > to burden users with only one "section" to always enter the section name > as a required argument, but I also want to make it as convenient as > possible to enter the section name for those who need to. > > My thought, on the thinking that practicality beats purity, was to create > a zero-length switch using a different prefix character (say, @) to > indicate the section name. So instead of typing this: > > sp subcommand -s abc foo bar > > they could type this: > > sp subcommand @abc foo bar > > Admittedly a small benefit. I tried the following but argparse doesn't > seem to do what I'd hoped: > > p = argparse.ArgumentParser(prefix_chars='-@') > p.add_argument('@',type=str,dest='section') > ar = p.parse_args(['@abc']) > > This throws an exception claiming unrecognized arguments. > > Is there a way (that's not a hack) to do this? Since the current behavior > of the above code seems to do nothing useful, it could be added to > argparse with very low risk of backwards incompatibility.
If the number of positional arguments is otherwise fixed you could make section a positional argument with nargs="?" >>> import argparse >>> parser = argparse.ArgumentParser() >>> _ = parser.add_argument("section", nargs="?") >>> _ = parser.add_argument("foo") >>> _ = parser.add_argument("bar") >>> parser.parse_args(["alpha", "beta"]) Namespace(bar='beta', foo='alpha', section=None) >>> parser.parse_args(["alpha", "beta", "gamma"]) Namespace(bar='gamma', foo='beta', section='alpha') -- http://mail.python.org/mailman/listinfo/python-list