Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2c349bb

Browse files
committed
Rewritten by Lars Wizenius to add long options
1 parent 8727df4 commit 2c349bb

1 file changed

Lines changed: 90 additions & 25 deletions

File tree

Lib/getopt.py

Lines changed: 90 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,95 @@
1818
# occurrences.) Boolean options have '' as option_argument.
1919
# (2) the list of remaining arguments (may be empty).
2020

21+
# Added by Lars Wirzenius ([email protected]): A third argument is optional.
22+
# If present, getopt.getopt works similar to the GNU getopt_long
23+
# function (but optional arguments are not supported). The third
24+
# argument should be a list of strings that name the long options. If
25+
# the name ends '=', the argument requires an argument.
26+
27+
# (While making this addition, I rewrote the whole thing.)
28+
29+
import string
30+
2131
error = 'getopt error'
2232

23-
def getopt(args, options):
24-
list = []
25-
while args and args[0][:1] == '-' and args[0] <> '-':
26-
if args[0] == '--':
27-
args = args[1:]
28-
break
29-
optstring, args = args[0][1:], args[1:]
30-
while optstring <> '':
31-
opt, optstring = optstring[0], optstring[1:]
32-
if classify(opt, options): # May raise exception as well
33-
if optstring == '':
34-
if not args:
35-
raise error, 'option -' + opt + ' requires argument'
36-
optstring, args = args[0], args[1:]
37-
optarg, optstring = optstring, ''
38-
else:
39-
optarg = ''
40-
list.append('-' + opt, optarg)
41-
return list, args
42-
43-
def classify(opt, options): # Helper to check type of option
44-
for i in range(len(options)):
45-
if opt == options[i] <> ':':
46-
return options[i+1:i+2] == ':'
47-
raise error, 'option -' + opt + ' not recognized'
33+
def getopt(args, shortopts, longopts = []):
34+
list = []
35+
longopts = longopts[:]
36+
longopts.sort()
37+
while args and args[0][:1] == '-' and args[0] != '-':
38+
if args[0] == '-' or args[0] == '--':
39+
args = args[1:]
40+
break
41+
if args[0][:2] == '--':
42+
list, args = do_longs(list, args[0][2:],
43+
longopts, args[1:])
44+
else:
45+
list, args = do_shorts(list, args[0][1:],
46+
shortopts, args[1:])
47+
48+
return list, args
49+
50+
def do_longs(list, opt, longopts, args):
51+
try:
52+
i = string.index(opt, '=')
53+
opt, optarg = opt[:i], opt[i+1:]
54+
except ValueError:
55+
optarg = ''
56+
57+
has_arg, opt = long_has_args(opt, longopts)
58+
if has_arg:
59+
if not optarg:
60+
if not args:
61+
raise error, 'option --' + opt + \
62+
' requires argument'
63+
optarg, args = args[0], args[1:]
64+
else:
65+
if optarg:
66+
raise error, 'argument --' + opt + \
67+
' must not have an argument'
68+
list.append('--' + opt, optarg)
69+
return list, args
70+
71+
# Return:
72+
# has_arg?
73+
# full option name
74+
def long_has_args(opt, longopts):
75+
optlen = len(opt)
76+
for i in range(len(longopts)):
77+
x, y = longopts[i][:optlen], longopts[i][optlen:]
78+
if opt != x:
79+
continue
80+
if y != '' and y != '=' and i+1 < len(longopts):
81+
if opt == longopts[i+1][:optlen]:
82+
raise error, 'option --' + opt + \
83+
' not a unique prefix'
84+
if longopts[i][-1:] == '=':
85+
return 1, longopts[i][:-1]
86+
return 0, longopts[i]
87+
raise error, 'option --' + opt + ' not recognized'
88+
89+
def do_shorts(list, optstring, shortopts, args):
90+
while optstring != '':
91+
opt, optstring = optstring[0], optstring[1:]
92+
if short_has_arg(opt, shortopts):
93+
if optstring == '':
94+
if not args:
95+
raise error, 'option -' + opt + \
96+
' requires argument'
97+
optstring, args = args[0], args[1:]
98+
optarg, optstring = optstring, ''
99+
else:
100+
optarg = ''
101+
list.append('-' + opt, optarg)
102+
return list, args
103+
104+
def short_has_arg(opt, shortopts):
105+
for i in range(len(shortopts)):
106+
if opt == shortopts[i] != ':':
107+
return shortopts[i+1:i+2] == ':'
108+
raise error, 'option -' + opt + ' not recognized'
109+
110+
if __name__ == '__main__':
111+
import sys
112+
print getopt(sys.argv[1:], "a:b")

0 commit comments

Comments
 (0)