a better getopt than getopt.py?
Alex Martelli
aleaxit at yahoo.com
Tue Feb 20 07:58:12 EST 2001
More information about the Python-list mailing list
Tue Feb 20 07:58:12 EST 2001
- Previous message (by thread): a better getopt than getopt.py?
- Next message (by thread): a better getopt than getopt.py?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
"Sean 'Shaleh' Perry" <shaleh at valinux.com> wrote in message news:mailman.982632084.17484.python-list at python.org... > Writing my fisrt real python app that people will run from the command line > (most of my previous coding has been modules for other software to web stuff) > I decided to use getopt. My setup looks like this: > > LONG_OPTIONS = ['help', 'setup-lab', 'lab='] > SHORT_OPTIONS = 'hS' > > try: > optlist, args = getopt.getopt(sys.argv[1:], SHORT_OPTIONS, > LONG_OPTIONS) > except getopt.error, e: > print e > print USAGE > sys.exit(1) > > for option, argument in optlist: > if option in ('-h', '--help'): > print USAGE > sys.exit(0) > elif option in ('-S', '--setup-lab'): > print 'Want to set up the lab ...' > elif option == 'lab': > print 'Put lab in: ' + argument > > this means I have my options defined twice and then once again in the USAGE > output. Is there not a better way to handle arguments? I think you basically want to group an option's short-form (if any), its long-form (if any), and a unique-identifier for the option itself (off which you can key an if/elif tree) into one 'chunk'. You can dress and package this up in several ways, of course, but, at the root, it will be (before optimization...!-) something like: Options = ( ('help', 'h', 'H'), ('setup-lab', 'S', 'S'), ('lab=', None, 'L') ) def long(Options): return [long for long, short, unique in Options if not long is None] def short(Options): return [short for long, short, unique in Options if not short is None] def unique(option, Options): def short_to_unique(a_short, Options): for long, short, unique in Options: if a_short == short: return unique return None def long_to_unique(a_long, Options): for long, short, unique in Options: if a_long == long: return unique return None if option.startswith('--'): return long_to_unique(option[2:], Options) elif option.startswith('-'): return short_to_unique(option[1:], Options) else: return long_to_unique(option+'=', Options) and your mainline code becomes, in turn: try: optlist, args = getopt.getopt(sys.argv[1:], short(Options), long(Options)) except getopt.error, e: print e print USAGE sys.exit(1) for option, argument in optlist: optionId = unique(option, Options) if optionId == 'H': print USAGE sys.exit(0) elif optionId == 'S': print 'Want to set up the lab ...' elif optionId == 'L': print 'Put lab in: ' + argument Packaging this up as one nice support class or function allowing a direct (and faster...) loop of the form: allOpts, args = GetAllOpts(Options) for optionId, argument in allOpts: if optionId == 'H': etc etc, is left as an easy exercise for the reader:-). Alex
- Previous message (by thread): a better getopt than getopt.py?
- Next message (by thread): a better getopt than getopt.py?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list