# Usage: # # you can optionnaly pass two callback log(string) to log error and warning. # If you don't, error will assert and warning will be ignored # parser = kwargsParser(kwargs) # # some_arg = parser.parse_args('some_arg',None) # some_other_arg = parser.parse_args('some_other_arg',False) # # parser.validate_args() #optional, will assert if kwargs contain unknow args and will display a list of valid args # class kwargsParser(): def __init__(self,kwargs,log_error_cb = None, log_warning_cb = None): self.kwargs = dict(kwargs) self.valid_args = list() self.log_error_cb = log_error_cb self.log_warning_cb = log_warning_cb def parse_args(self,arg_name,default_value,legacy_args_name = []): self.valid_args.append(arg_name) arg_found = None if arg_name in self.kwargs: arg_found = arg_name else: #let's check legacy args for legacy_arg in legacy_args_name: if legacy_arg in self.kwargs: arg_found = legacy_arg self.log_warning(f"{arg_found} is a legacy arg please use {arg_name} instead") break if arg_found: for legacy_arg in legacy_args_name: if arg_found != legacy_arg and legacy_arg in self.kwargs: self.log_warning(f"{legacy_arg} is a legacy arg and will ignored as you used {arg_name} before") value = self.kwargs[arg_found] del self.kwargs[arg_found] return value else: return default_value def log_error(self, error_string): if self.log_error_cb: self.log_error_cb(error_string) else: assert False, error_string def log_warning(self, warning_string): if self.log_warning_cb: self.log_warning_cb(warning_string) def validate_args(self,args_to_ignore_in_validation = []): for arg in args_to_ignore_in_validation: if arg in self.kwargs: del self.kwargs[arg] args_left = len(self.kwargs) if args_left != 0: self.log_error(f"Unknown kwargs : {self.kwargs}. Valid args are {self.valid_args}")