diff options
Diffstat (limited to 'Lib/getopt.py')
| -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 821ea6b6a8..5d71b28254 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"])  | 
