Layout and cleanup by Fred

This commit is contained in:
Guido van Rossum 1996-09-11 19:43:52 +00:00
parent 28d4ba24c9
commit 1550ff722d
1 changed files with 73 additions and 79 deletions

View File

@ -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.
# 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 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).
# 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:])
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
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 = ''
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 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
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"])