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 <jan@janware.com>
This commit is contained in:
Jan Lindemann 2025-05-16 06:52:45 +02:00
commit 51f08d3dce

View file

@ -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)