From 742a041440e4fcc40096a8200ed2a78a6c9d9a3a Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 26 May 2022 16:07:21 +0000 Subject: [PATCH] mmgen-tool: support explicit typing via annotations --- mmgen/main_tool.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/mmgen/main_tool.py b/mmgen/main_tool.py index 08054047..f8f5e6e1 100755 --- a/mmgen/main_tool.py +++ b/mmgen/main_tool.py @@ -182,28 +182,33 @@ def create_call_sig(cmd,cls,parsed=False): ann = m.__annotations__ nargs = len(args) - len(dfls) + dfl_types = tuple( + ann[a] if a in ann and isinstance(ann[a],type) else type(dfls[i]) + for i,a in enumerate(args[nargs:]) ) def get_type_from_ann(arg): - return ann[arg][1:] + (' or STDIN','')[parsed] if ann[arg] == 'sstr' else ann[arg].__name__ + return ( + ('str' + ('' if parsed else ' or STDIN')) if ann[arg] == 'sstr' else + ann[arg].__name__ ) if parsed: - c_args = [(a,get_type_from_ann(a)) for a in args[:nargs]] - c_kwargs = [(a,dfls[n]) for n,a in enumerate(args[nargs:])] return ( - c_args, - dict(c_kwargs), - 'STDIN_OK' if c_args and ann[args[0]] == 'sstr' else flag ) + [(a,get_type_from_ann(a)) for a in args[:nargs]], # c_args + dict([(a,dfls[n]) for n,a in enumerate(args[nargs:])]), # c_kwargs + dict([(a,dfl_types[n]) for n,a in enumerate(args[nargs:])]), # c_kwargs_types + ('STDIN_OK' if nargs and ann[args[0]] == 'sstr' else flag) ) # flag else: c_args = [f'{a} [{get_type_from_ann(a)}]' for a in args[:nargs]] - c_kwargs = ['"{}" [{}={!r}{}]'.format( - a, - type(dfls[n]).__name__, dfls[n], - (' ' + ann[a] if a in ann else '') ) + c_kwargs = ['{a} [{b}={c!r}{d}]'.format( + a = a, + b = dfl_types[n].__name__, + c = dfls[n], + d = (' ' + ann[a] if a in ann and isinstance(ann[a],str) else '') ) for n,a in enumerate(args[nargs:])] return ' '.join(c_args + c_kwargs) def process_args(cmd,cmd_args,cls): - c_args,c_kwargs,flag = create_call_sig(cmd,cls,parsed=True) + c_args,c_kwargs,c_kwargs_types,flag = create_call_sig(cmd,cls,parsed=True) have_stdin_input = False def usage_die(s): @@ -281,7 +286,7 @@ def process_args(cmd,cmd_args,cls): args = [conv_type(u_args[i],c_args[0][0],c_args[0][1]) for i in range(len(u_args))] else: args = [conv_type(u_args[i],c_args[i][0],c_args[i][1]) for i in range(len(c_args))] - kwargs = {k:conv_type(u_kwargs[k],k,type(c_kwargs[k]).__name__) for k in u_kwargs} + kwargs = {k:conv_type(u_kwargs[k],k,c_kwargs_types[k].__name__) for k in u_kwargs} return ( args, kwargs )