jw-python/tools/python/jwutils/ArgsContainer.py

83 lines
2.4 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
import argparse
from collections import OrderedDict
from jwutils.log import *
class ArgsContainer: # export
__args: OrderedDict[str, str] = OrderedDict()
__kwargs: OrderedDict[str, str] = OrderedDict()
__values: dict[str, str] = {}
__specified_args: list[str] = 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()
def args(self, name) -> str:
return self.__args[name]
def kwargs(self, name) -> str:
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)