mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-python
synced 2026-01-15 09:53:32 +01:00
ArgsContainer.specified_args is a list of arguments that were explicitly specified, i.e. not defaults, in the order they were specified in. Signed-off-by: Jan Lindemann <jan@janware.com>
85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
# -*- 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)
|