# -*- coding: utf-8 -*- import argparse from collections import OrderedDict from jwutils.log import * class ArgsContainer: # export __args = OrderedDict() __kwargs = OrderedDict() __values = {} __specified_args = list() def __getattr__(self, name): values = self.__values if name in self.__values: return self.__values[name] if name in self.__kwargs.keys(): d = self.__kwargs[name] if 'default' in d: return d['default'] raise Exception(f'No value for argument "{name}"') raise Exception(f'No argument "{name}" defined') def __setattr__(self, name, value): if not name in self.__kwargs.keys(): raise Exception(f'No argument "{name}" defined') self.__values[name] = value self.__specified_args.append(name) def add_argument(self, *args, **kwargs): for arg in args: if arg[0] != '-': name = arg break if arg[:2] == '--': name = arg[2:] break else: raise Exception('Missing argument name') name = name.replace('-', '_') self.__args[name] = args self.__kwargs[name] = kwargs def keys(self): return self.__args.keys() @property def args(self, name): return self.__args[name] @property def kwargs(self, name): return self.__kwargs[name] def dump(self, prio, *args, **kwargs): caller = get_caller_pos(**kwargs) for name in self.__kwargs.keys(): val = None try: val = self.__getattr__(name) except: pass slog(prio, f'{name}: {val}', caller=caller) @property def specified_args(self): return self.__specified_args def add_argument(p: argparse.ArgumentParser|ArgsContainer, name: str, *args, **kwargs): # export key = name.strip('--').replace('-', '_') if isinstance(p, ArgsContainer): if key in p.keys(): return elif isinstance(p, argparse.ArgumentParser): for action in p._actions: if key == action.dest: return else: raise Exception('Unknown type {type(p)} of {p} passed to add_argument()') p.add_argument(name, *args, **kwargs)