On Sunday 26 June 2016 02:51 PM, Joseph L. Casale wrote: > I have some code where sys.argv is sliced up and manually fed to discrete > argparse > instances each with a single subparser. The reason the discrete parsers all > having a > single subparser was to make handling the input simpler, the first arg in the > slice > could be left in. > > This has become unmaintainable as the manual slicing is always subject to a > new case > by where a parser has a positional, switch or optional parameter for example. > Also, since > argv is grouped by subparser specifiers, if a parameter has input that > matches a keyword > it all goes pear shaped. > > The underlying root of this mess is a long unaddressed limitation in argparse > to support > multiple subparser specifications on the same invocation: > > prog.py -x -y 42 -foo bar subParserA -a 1 -b 2 subParserB -a 1 -b 2 > subParserB -a 1 -b 2 > > The base arguments (-x -y 42 -foo bar). > An invocation of "subParserA" and its arguments (-a 1 -b 2). > Two invocations of "subParserB" and their arguments. > > etc... > > I have seen some creative ways to overcome this on stacktrace, however I > thought I'd > see what people here have done. The code is pinned at 2.7 and while several > people > have created alternate implementations which address many of argparses > failures, its > desired to stick to base lib but that can easily be changed given a > compelling reason > if an alternate implementation exists that works well.
Not sure if this fits the bill, or makes sense here, but I came cross "docopt" which touts itself as a "Command-line interface description language". I used it in a project and it seems to be pretty easy to use as well as elegant. It stores the arguments & values as a dictionary, keyed by the argument. from docopt import docopt arguments = docopt(__doc__, version='0.2') # Set verbose flag verbose = False if arguments['--verbose']: verbose = True elif arguments['-q']: verbose = False # If --noencrypt, --nosign or --notransfer is specified, put that in config if arguments['--no-encrypt']: config['noencrypt'] = True else: config['noencrypt'] = False if arguments['--no-sign']: config['nosign'] = True else: config['nosign'] = False if arguments['--no-transfer']: config['notransfer'] = True else: config['notransfer'] = False and so on ... -- https://mail.python.org/mailman/listinfo/python-list