From 51f08d3dce27d3b1a3ef742da27f6453950a39dd Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Fri, 16 May 2025 06:52:45 +0200 Subject: [PATCH] ArgsContainer: Add class ArgsContainer provides an interface similar to argparse.ArgumentParser and can be used as a drop-in replacement when fishing for arguments. Signed-off-by: Jan Lindemann --- tools/python/jwutils/ArgsContainer.py | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tools/python/jwutils/ArgsContainer.py diff --git a/tools/python/jwutils/ArgsContainer.py b/tools/python/jwutils/ArgsContainer.py new file mode 100644 index 0000000..a0aa7f5 --- /dev/null +++ b/tools/python/jwutils/ArgsContainer.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +from collections import OrderedDict + +from jwutils.log import * + +class ArgsContainer: # export + + __args = OrderedDict() + __kwargs = OrderedDict() + __values = {} + + 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 + + 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)