@@ -56,8 +56,10 @@ def _was_command_used(self, cmdline_arg):
56
56
run the script that has this parser."""
57
57
# self.cmd_used is like: ['something.py', '-p', 'test.py', '--s1', 'something']
58
58
for cmd in self .cmd_used :
59
- if cmdline_arg in cmd :
60
- return True
59
+ # Sometimes, a command is run with '=': 'driver.py --something=this'
60
+ for c in cmd .split ('=' ):
61
+ if cmdline_arg == c :
62
+ return True
61
63
return False
62
64
63
65
def _is_arg_default_value (self , arg ):
@@ -67,11 +69,7 @@ def _is_arg_default_value(self, arg):
67
69
"""
68
70
# each cmdline_arg is either '-*' or '--*'.
69
71
for cmdline_arg in self ._option_string_actions :
70
- #print('examining arg == self._option_string_actions[cmdline_arg].dest: {} == {}'.format(arg, self._option_string_actions[cmdline_arg].dest))
71
- #print('examining cmdline_arg in self.cmd_used: {} in {}'.format(cmdline_arg, self.cmd_used))
72
- # if arg == self._option_string_actions[cmdline_arg].dest and cmdline_arg in self.cmd_used:
73
72
if arg == self ._option_string_actions [cmdline_arg ].dest and self ._was_command_used (cmdline_arg ):
74
- #print('{} IS NOT SET TO ITS DEFAULT VALUE!'.format(arg))
75
73
return False
76
74
return True
77
75
@@ -89,7 +87,7 @@ def _parse_arguments(self):
89
87
if self .__args_namespace is None :
90
88
self .__args_namespace = self .parse_args ()
91
89
92
- def get_orig_parameters (self , default_vars = True , check_values = True , cmd_default_vars = True ):
90
+ def get_orig_parameters (self , check_values = False ):
93
91
"""Returns the parameters created by -p. If -p wasn't used, returns None."""
94
92
self ._parse_arguments ()
95
93
@@ -98,22 +96,19 @@ def get_orig_parameters(self, default_vars=True, check_values=True, cmd_default_
98
96
99
97
parameter = self .__parameter_cls ()
100
98
101
- if not default_vars : # remove all of the variables
102
- parameter .__dict__ .clear ()
99
+ # remove all of the variables
100
+ parameter .__dict__ .clear ()
103
101
104
102
# if self.__args_namespace.parameters is not None:
105
103
parameter .load_parameter_from_py (
106
104
self .__args_namespace .parameters )
107
105
108
- if cmd_default_vars :
109
- self ._get_default_from_cmdline (parameter )
110
-
111
106
if check_values :
112
107
parameter .check_values ()
113
108
114
109
return parameter
115
110
116
- def get_parameters_from_json (self , json_file , default_vars = True , check_values = True , cmd_default_vars = True ):
111
+ def get_parameters_from_json (self , json_file , check_values = False ):
117
112
"""Given a json file, return the parameters from it."""
118
113
with open (json_file ) as f :
119
114
json_data = json .loads (f .read ())
@@ -123,15 +118,12 @@ def get_parameters_from_json(self, json_file, default_vars=True, check_values=Tr
123
118
for single_run in json_data [key ]:
124
119
p = self .__parameter_cls ()
125
120
126
- if not default_vars : # remove all of the variables
127
- p .__dict__ .clear ()
121
+ # remove all of the variables
122
+ p .__dict__ .clear ()
128
123
129
124
for attr_name in single_run :
130
125
setattr (p , attr_name , single_run [attr_name ])
131
126
132
- if cmd_default_vars :
133
- self ._get_default_from_cmdline (p )
134
-
135
127
if check_values :
136
128
p .check_values ()
137
129
@@ -166,7 +158,7 @@ def _create_cfg_hash_titles(self, cfg_file):
166
158
i += 1
167
159
return StringIO ('\n ' .join (lines ))
168
160
169
- def get_parameters_from_cfg (self , cfg_file , default_vars = True , check_values = True , cmd_default_vars = True ):
161
+ def get_parameters_from_cfg (self , cfg_file , check_values = False ):
170
162
"""Given a cfg file, return the parameters from it."""
171
163
parameters = []
172
164
@@ -178,24 +170,21 @@ def get_parameters_from_cfg(self, cfg_file, default_vars=True, check_values=True
178
170
for section in config .sections ():
179
171
p = self .__parameter_cls ()
180
172
181
- if not default_vars : # remove all of the variables
182
- p .__dict__ .clear ()
173
+ # remove all of the variables
174
+ p .__dict__ .clear ()
183
175
184
176
for k , v in config .items (section ):
185
177
v = yaml .safe_load (v )
186
178
setattr (p , k , v )
187
179
188
- if cmd_default_vars :
189
- self ._get_default_from_cmdline (p )
190
-
191
180
if check_values :
192
181
p .check_values ()
193
182
194
183
parameters .append (p )
195
184
196
185
return parameters
197
186
198
- def get_other_parameters (self , files_to_open = [], default_vars = True , check_values = True , cmd_default_vars = True ):
187
+ def get_other_parameters (self , files_to_open = [], check_values = False ):
199
188
"""Returns the parameters created by -d, If files_to_open is defined,
200
189
then use the path specified instead of -d"""
201
190
parameters = []
@@ -208,9 +197,9 @@ def get_other_parameters(self, files_to_open=[], default_vars=True, check_values
208
197
if files_to_open is not None :
209
198
for diags_file in files_to_open :
210
199
if '.json' in diags_file :
211
- params = self .get_parameters_from_json (diags_file , default_vars , check_values , cmd_default_vars )
200
+ params = self .get_parameters_from_json (diags_file , check_values )
212
201
elif '.cfg' in diags_file :
213
- params = self .get_parameters_from_cfg (diags_file , default_vars , check_values , cmd_default_vars )
202
+ params = self .get_parameters_from_cfg (diags_file , check_values )
214
203
else :
215
204
raise RuntimeError (
216
205
'The parameters input file must be either a .json or .cfg file' )
@@ -229,32 +218,17 @@ def _were_cmdline_args_used(self):
229
218
return True
230
219
return False
231
220
232
- def _overwrite_parameters_with_cmdline_args (self , parameters , cmd_default_vars = True ):
221
+ def _overwrite_parameters_with_cmdline_args (self , parameters ):
233
222
"""
234
- Overwrite the parameters with the user's command line arguments.
235
- Case 1: No param in parameters, use what's in --param. Even if cmdline arg (--param) is a default argument.
236
- Case 2: When there's a param in parameters and --param is given, use cmdline arg, but only if it's NOT a default value.
237
-
238
- So the only use of the default in a cmdline arg is when there's nothing for it in parameters.
223
+ Add the command line parameters used to the parameter object.
239
224
"""
240
225
for arg_name , arg_value in vars (self .__args_namespace ).items ():
241
- #print('Examining (arg, value): ({}, {})'.format(arg_name, arg_value))
242
- if not cmd_default_vars and self ._is_arg_default_value (arg_name ):
243
- #print('_is_arg_default_value(arg_name): {}'.format(self._is_arg_default_value(arg_name)))
244
- #print('NOT USING: {}'.format(arg_name))
245
- continue
246
-
247
- # Case 1
248
- if not hasattr (parameters , arg_name ):
249
- setattr (parameters , arg_name , arg_value )
250
- # Case 2
251
- if hasattr (parameters , arg_name ) and not self ._is_arg_default_value (arg_name ):
226
+ if not self ._is_arg_default_value (arg_name ):
252
227
setattr (parameters , arg_name , arg_value )
253
228
254
- def get_cmdline_parameters (self , default_vars = True , check_values = False , cmd_default_vars = True ):
229
+ def get_cmdline_parameters (self , check_values = False ):
255
230
"""
256
231
Use the other command line args besides -p and -d to create a single parameters object.
257
- cmd_default_vars is used to see if the `default` option in ArgumentParser.add_argument() should be used.
258
232
"""
259
233
self ._parse_arguments ()
260
234
@@ -263,20 +237,48 @@ def get_cmdline_parameters(self, default_vars=True, check_values=False, cmd_defa
263
237
264
238
parameter = self .__parameter_cls ()
265
239
266
- if not default_vars : # remove all of the variables
267
- parameter .__dict__ .clear ()
240
+ # remove all of the variables
241
+ parameter .__dict__ .clear ()
268
242
269
- self ._overwrite_parameters_with_cmdline_args (parameter , cmd_default_vars )
243
+ self ._overwrite_parameters_with_cmdline_args (parameter )
270
244
271
245
if check_values :
272
246
parameter .check_values ()
273
247
274
248
return parameter
275
249
276
- def combine_params (self , cmdline_parameters = None , orig_parameters = None , other_parameters = None , vars_to_ignore = []):
277
- """Combine cmdline_params (-* or --*), orig_parameters (-p), and other_parameters (-d), while ignoring vars_to_ignore"""
250
+ def _add_default_values (self , parameter , default_vars = False , cmd_default_vars = False ):
251
+ """
252
+ Add the default values to the parameter.
253
+ These can come from the default values defined in the Parameter class,
254
+ or the `default` option defined in ArgumentParser.add_argument().
255
+ """
256
+ # Add the command line default parameters first
257
+ if cmd_default_vars :
258
+ for arg_name , arg_value in vars (self .__args_namespace ).items ():
259
+ #print('examining (arg_name, arg_value): ({}, {})'.format(arg_name, arg_value))
260
+ if arg_name in parameter .__dict__ or not self ._is_arg_default_value (arg_name ):
261
+ continue
262
+ # Only add the default values, that aren't already in parameter.
263
+ setattr (parameter , arg_name , arg_value )
264
+
265
+ # Then add the defaults defined in the Parameter class
266
+ if default_vars :
267
+ for arg_name , arg_value in vars (self .__parameter_cls ()).items ():
268
+ if arg_name in parameter .__dict__ :
269
+ continue
270
+ setattr (parameter , arg_name , arg_value )
271
+
272
+ def combine_params (self , cmdline_parameters = None , orig_parameters = None , other_parameters = None , vars_to_ignore = [], default_vars = False , cmd_default_vars = False ):
273
+ """
274
+ Combine cmdline_params (-* or --*), orig_parameters (-p), and other_parameters (-d),
275
+ while ignoring vars_to_ignore.
276
+ Add any default arguments here as well.
277
+ """
278
278
if other_parameters :
279
279
for parameters in other_parameters :
280
+ self ._add_default_values (parameters , default_vars , cmd_default_vars )
281
+
280
282
# orig_parameters args take precedence over other_parameters
281
283
if orig_parameters :
282
284
for var in orig_parameters .__dict__ :
@@ -289,13 +291,21 @@ def combine_params(self, cmdline_parameters=None, orig_parameters=None, other_pa
289
291
if var not in vars_to_ignore :
290
292
parameters .__dict__ [var ] = cmdline_parameters .__dict__ [var ]
291
293
292
- # might just combine cmdline_params with orig_params
293
- elif not other_parameters and orig_parameters and cmdline_parameters :
294
- #print('ADDING CMDLINE_PARAMETERS TO ORIG_PARAMETERS.')
295
- for var in cmdline_parameters .__dict__ :
296
- if var not in vars_to_ignore :
297
- #print('ADDING {}'.format(var))
298
- orig_parameters .__dict__ [var ] = cmdline_parameters .__dict__ [var ]
294
+ else :
295
+ # just combine cmdline_params with orig_params
296
+ if orig_parameters and cmdline_parameters :
297
+ self ._add_default_values (orig_parameters , default_vars , cmd_default_vars )
298
+
299
+ for var in cmdline_parameters .__dict__ :
300
+ # if var not in vars_to_ignore and self._was_command_used(var):
301
+ if var not in vars_to_ignore :
302
+ # Only add it if it was not in param and was passed from cmd line
303
+ orig_parameters .__dict__ [var ] = cmdline_parameters .__dict__ [var ]
304
+
305
+ elif orig_parameters :
306
+ self ._add_default_values (orig_parameters , default_vars , cmd_default_vars )
307
+ elif cmdline_parameters :
308
+ self ._add_default_values (cmdline_parameters , default_vars , cmd_default_vars )
299
309
300
310
def combine_orig_and_other_params (self , orig_parameters , other_parameters , vars_to_ignore = []):
301
311
"""Combine orig_parameters with all of the other_parameters, while ignoring vars_to_ignore"""
@@ -340,13 +350,12 @@ def granulate(self, parameters):
340
350
def get_parameters (self , cmdline_parameters = None , orig_parameters = None , other_parameters = [], vars_to_ignore = [], default_vars = True , cmd_default_vars = True , * args , ** kwargs ):
341
351
"""Get the parameters based on the command line arguments and return a list of them."""
342
352
if not cmdline_parameters :
343
- cmdline_parameters = self .get_cmdline_parameters (default_vars = default_vars , cmd_default_vars = cmd_default_vars , * args , ** kwargs )
353
+ cmdline_parameters = self .get_cmdline_parameters (* args , ** kwargs )
344
354
if not orig_parameters :
345
- orig_parameters = self .get_orig_parameters (default_vars = default_vars , cmd_default_vars = cmd_default_vars , * args , ** kwargs )
355
+ orig_parameters = self .get_orig_parameters (* args , ** kwargs )
346
356
if other_parameters == []:
347
- other_parameters = self .get_other_parameters (default_vars = default_vars , cmd_default_vars = cmd_default_vars , * args , ** kwargs )
348
-
349
- self .combine_params (cmdline_parameters , orig_parameters , other_parameters , vars_to_ignore )
357
+ other_parameters = self .get_other_parameters (* args , ** kwargs )
358
+ self .combine_params (cmdline_parameters , orig_parameters , other_parameters , vars_to_ignore , default_vars , cmd_default_vars )
350
359
351
360
if other_parameters != []:
352
361
return self .granulate (other_parameters )
@@ -374,7 +383,7 @@ def get_parameter(self, warning=False, *args, **kwargs):
374
383
return self .get_parameters (* args , ** kwargs )[0 ]
375
384
376
385
def load_default_args_from_json (self , files ):
377
- """ take in a list of json files (or a single json file) and create the args from it"""
386
+ """Take in a list of json files (or a single json file) and create the args from it. """
378
387
if not isinstance (files , (list , tuple )):
379
388
files = [files ]
380
389
success = None
@@ -392,9 +401,9 @@ def load_default_args_from_json(self, files):
392
401
self .store_default_arguments (option_strings , params )
393
402
success = True
394
403
except :
395
- warnings .warn ("failed to load param {} from json file {}" .format (
396
- k ,afile ))
397
- pass
404
+ warnings .warn ("Failed to load param {} from json file {}" .format (
405
+ k , afile ))
406
+
398
407
return success
399
408
400
409
def store_default_arguments (self , options , params ):
0 commit comments