@@ -9,23 +9,23 @@ class _ArgError(BaseException):
9
9
pass
10
10
11
11
class _Arg :
12
- def __init__ (self , name , dest , action , nargs , const , default , help ):
13
- self .name = name
12
+ def __init__ (self , names , dest , action , nargs , const , default , help ):
13
+ self .names = names
14
14
self .dest = dest
15
15
self .action = action
16
16
self .nargs = nargs
17
17
self .const = const
18
18
self .default = default
19
19
self .help = help
20
20
21
- def parse (self , args ):
21
+ def parse (self , optname , args ):
22
22
# parse args for this arg
23
23
if self .action == "store" :
24
24
if self .nargs == None :
25
25
if args :
26
26
return args .pop (0 )
27
27
else :
28
- raise _ArgError ("expecting value for %s" % self . name )
28
+ raise _ArgError ("expecting value for %s" % optname )
29
29
elif self .nargs == "?" :
30
30
if args :
31
31
return args .pop (0 )
@@ -36,7 +36,7 @@ def parse(self, args):
36
36
n = - 1
37
37
elif self .nargs == "+" :
38
38
if not args :
39
- raise _ArgError ("expecting value for %s" % self . name )
39
+ raise _ArgError ("expecting value for %s" % optname )
40
40
n = - 1
41
41
else :
42
42
n = int (self .nargs )
@@ -53,20 +53,29 @@ def parse(self, args):
53
53
ret .append (args .pop (0 ))
54
54
n -= 1
55
55
if n > 0 :
56
- raise _ArgError ("expecting value for %s" % self . name )
56
+ raise _ArgError ("expecting value for %s" % optname )
57
57
return ret
58
58
elif self .action == "store_const" :
59
59
return self .const
60
60
else :
61
61
assert False
62
62
63
+ def _dest_from_optnames (opt_names ):
64
+ dest = opt_names [0 ]
65
+ for name in opt_names :
66
+ if name .startswith ("--" ):
67
+ dest = name
68
+ break
69
+ return dest .lstrip ("-" ).replace ("-" , "_" )
70
+
71
+
63
72
class ArgumentParser :
64
73
def __init__ (self , * , description = "" ):
65
74
self .description = description
66
75
self .opt = []
67
76
self .pos = []
68
77
69
- def add_argument (self , name , ** kwargs ):
78
+ def add_argument (self , * args , ** kwargs ):
70
79
action = kwargs .get ("action" , "store" )
71
80
if action == "store_true" :
72
81
action = "store_const"
@@ -79,17 +88,18 @@ def add_argument(self, name, **kwargs):
79
88
else :
80
89
const = kwargs .get ("const" , None )
81
90
default = kwargs .get ("default" , None )
82
- if name .startswith ("-" ):
91
+ if args and args [ 0 ] .startswith ("-" ):
83
92
list = self .opt
84
- if name .startswith ("--" ):
85
- dest = kwargs .get ("dest" , name [2 :])
86
- else :
87
- dest = kwargs .get ("dest" , name [1 :])
93
+ dest = kwargs .get ("dest" )
94
+ if dest is None :
95
+ dest = _dest_from_optnames (args )
88
96
else :
89
97
list = self .pos
90
- dest = kwargs .get ("dest" , name )
98
+ dest = kwargs .get ("dest" )
99
+ if dest is None :
100
+ dest = args [0 ]
91
101
list .append (
92
- _Arg (name , dest , action , kwargs .get ("nargs" , None ),
102
+ _Arg (args , dest , action , kwargs .get ("nargs" , None ),
93
103
const , default , kwargs .get ("help" , "" )))
94
104
95
105
def usage (self , full ):
@@ -106,7 +116,7 @@ def render_arg(arg):
106
116
else :
107
117
return ""
108
118
for opt in self .opt :
109
- print (" [%s%s]" % (opt .name , render_arg (opt )), end = "" )
119
+ print (" [%s%s]" % (', ' . join ( opt .names ) , render_arg (opt )), end = "" )
110
120
for pos in self .pos :
111
121
print (render_arg (pos ), end = "" )
112
122
print ()
@@ -120,11 +130,11 @@ def render_arg(arg):
120
130
if self .pos :
121
131
print ("\n positional args:" )
122
132
for pos in self .pos :
123
- print (" %-16s%s" % (pos .name , pos .help ))
133
+ print (" %-16s%s" % (pos .names [ 0 ] , pos .help ))
124
134
print ("\n optional args:" )
125
135
print (" -h, --help show this message and exit" )
126
136
for opt in self .opt :
127
- print (" %-16s%s" % (opt .name + render_arg (opt ), opt .help ))
137
+ print (" %-16s%s" % (', ' . join ( opt .names ) + render_arg (opt ), opt .help ))
128
138
129
139
def parse_args (self , args = None ):
130
140
if args is None :
@@ -157,8 +167,8 @@ def _parse_args(self, args):
157
167
sys .exit (0 )
158
168
found = False
159
169
for i , opt in enumerate (self .opt ):
160
- if a == opt .name :
161
- arg_vals [i ] = opt .parse (args )
170
+ if a in opt .names :
171
+ arg_vals [i ] = opt .parse (a , args )
162
172
found = True
163
173
break
164
174
if not found :
@@ -169,7 +179,7 @@ def _parse_args(self, args):
169
179
raise _ArgError ("extra args: %s" % " " .join (args ))
170
180
for pos in self .pos :
171
181
arg_dest .append (pos .dest )
172
- arg_vals .append (pos .parse (args ))
182
+ arg_vals .append (pos .parse (pos . names [ 0 ], args ))
173
183
parsed_pos = True
174
184
175
185
# build and return named tuple with arg values
0 commit comments