diff options
author | Guido van Rossum <guido@python.org> | 1996-09-11 19:43:52 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1996-09-11 19:43:52 (GMT) |
commit | 1550ff722d18962ec26284a32e2acccd2f626faf (patch) | |
tree | 1f95d23585d31dc5b8b0b369b3a7dc7ce5d5db5c | |
parent | 28d4ba24c9e56149ac618d66ed89abdc58e42f76 (diff) | |
download | cpython-1550ff722d18962ec26284a32e2acccd2f626faf.zip cpython-1550ff722d18962ec26284a32e2acccd2f626faf.tar.gz cpython-1550ff722d18962ec26284a32e2acccd2f626faf.tar.bz2 |
Layout and cleanup by Fred
-rw-r--r-- | Lib/getopt.py | 158 |
1 files changed, 76 insertions, 82 deletions
diff --git a/Lib/getopt.py b/Lib/getopt.py index 821ea6b..5d71b28 100644 --- a/Lib/getopt.py +++ b/Lib/getopt.py @@ -1,112 +1,106 @@ # module getopt -- Standard command line processing. # Function getopt.getopt() has a different interface but provides the -# same functionality as the Unix getopt() function. - -# It has two arguments: the first should be argv[1:] (it doesn't want -# the script name), the second the string of option letters as passed -# to Unix getopt() (i.e., a string of allowable option letters, with -# options requiring an argument followed by a colon). +# similar functionality to the Unix getopt() function, with the +# addition of long-option support. (Long option support added by Lars +# Wirzenius <liw@iki.fi>.) + +# It has two required arguments: the first should be argv[1:] (it +# doesn't want the script name), the second the string of option +# letters as passed to Unix getopt() (i.e., a string of allowable +# option letters, with options requiring an argument followed by a +# colon). + +# The optional third argument, if present, getopt.getopt works similar +# to the GNU getopt_long function (but optional arguments are not +# supported). The third argument should be a list of strings that +# name the long options. If the name ends '=', the argument requires +# an argument. # It raises the exception getopt.error with a string argument if it # detects an error. -# It returns two items: +# It returns two values: # (1) a list of pairs (option, option_argument) giving the options in # the order in which they were specified. (I'd use a dictionary # but applications may depend on option order or multiple # occurrences.) Boolean options have '' as option_argument. # (2) the list of remaining arguments (may be empty). -# Added by Lars Wirzenius (liw@iki.fi): A third argument is optional. -# If present, getopt.getopt works similar to the GNU getopt_long -# function (but optional arguments are not supported). The third -# argument should be a list of strings that name the long options. If -# the name ends '=', the argument requires an argument. - -# (While making this addition, I rewrote the whole thing.) - import string -error = 'getopt error' +error = 'getopt.error' def getopt(args, shortopts, longopts = []): - list = [] - longopts = longopts[:] - longopts.sort() - while args and args[0][:1] == '-' and args[0] != '-': - if args[0] == '-' or args[0] == '--': - args = args[1:] - break - if args[0][:2] == '--': - list, args = do_longs(list, args[0][2:], - longopts, args[1:]) - else: - list, args = do_shorts(list, args[0][1:], - shortopts, args[1:]) - - return list, args + list = [] + longopts = longopts[:] + longopts.sort() + while args and args[0][:1] == '-' and args[0] != '-': + if args[0] == '--': + args = args[1:] + break + if args[0][:2] == '--': + list, args = do_longs(list, args[0][2:], longopts, args[1:]) + else: + list, args = do_shorts(list, args[0][1:], shortopts, args[1:]) + + return list, args def do_longs(list, opt, longopts, args): - try: - i = string.index(opt, '=') - opt, optarg = opt[:i], opt[i+1:] - except ValueError: - optarg = '' - - has_arg, opt = long_has_args(opt, longopts) - if has_arg: - if not optarg: - if not args: - raise error, 'option --' + opt + \ - ' requires argument' - optarg, args = args[0], args[1:] - else: - if optarg: - raise error, 'argument --' + opt + \ - ' must not have an argument' - list.append('--' + opt, optarg) - return list, args + try: + i = string.index(opt, '=') + opt, optarg = opt[:i], opt[i+1:] + except ValueError: + optarg = None + + has_arg, opt = long_has_args(opt, longopts) + if has_arg: + if optarg is None: + if not args: + raise error, 'option --%s requires argument' % opt + optarg, args = args[0], args[1:] + elif optarg: + raise error, 'option --%s must not have an argument' % opt + list.append(('--' + opt, optarg or '')) + return list, args # Return: # has_arg? # full option name def long_has_args(opt, longopts): - optlen = len(opt) - for i in range(len(longopts)): - x, y = longopts[i][:optlen], longopts[i][optlen:] - if opt != x: - continue - if y != '' and y != '=' and i+1 < len(longopts): - if opt == longopts[i+1][:optlen]: - raise error, 'option --' + opt + \ - ' not a unique prefix' - if longopts[i][-1:] == '=': - return 1, longopts[i][:-1] - return 0, longopts[i] - raise error, 'option --' + opt + ' not recognized' + optlen = len(opt) + for i in range(len(longopts)): + x, y = longopts[i][:optlen], longopts[i][optlen:] + if opt != x: + continue + if y != '' and y != '=' and i+1 < len(longopts): + if opt == longopts[i+1][:optlen]: + raise error, 'option --%s not a unique prefix' % opt + if longopts[i][-1:] in ('=', ): + return 1, longopts[i][:-1] + return 0, longopts[i] + raise error, 'option --' + opt + ' not recognized' def do_shorts(list, optstring, shortopts, args): - while optstring != '': - opt, optstring = optstring[0], optstring[1:] - if short_has_arg(opt, shortopts): - if optstring == '': - if not args: - raise error, 'option -' + opt + \ - ' requires argument' - optstring, args = args[0], args[1:] - optarg, optstring = optstring, '' - else: - optarg = '' - list.append('-' + opt, optarg) - return list, args + while optstring != '': + opt, optstring = optstring[0], optstring[1:] + if short_has_arg(opt, shortopts): + if optstring == '': + if not args: + raise error, 'option -%s requires argument' % opt + optstring, args = args[0], args[1:] + optarg, optstring = optstring, '' + else: + optarg = '' + list.append(('-' + opt, optarg)) + return list, args def short_has_arg(opt, shortopts): - for i in range(len(shortopts)): - if opt == shortopts[i] != ':': - return shortopts[i+1:i+2] == ':' - raise error, 'option -' + opt + ' not recognized' + for i in range(len(shortopts)): + if opt == shortopts[i] != ':': + return shortopts[i+1:i+2] == ':' + raise error, 'option -%s not recognized' % opt if __name__ == '__main__': - import sys - print getopt(sys.argv[1:], "a:b") + import sys + print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]) |