Skip to content

Instantly share code, notes, and snippets.

@4383
Last active March 4, 2019 18:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 4383/ff2894c35d8f392f0d54b5240b4307ba to your computer and use it in GitHub Desktop.
Save 4383/ff2894c35d8f392f0d54b5240b4307ba to your computer and use it in GitHub Desktop.
Generate a function parameters (args, kwargs) from strings by converting it with called function signature
from inspect import signature
import copy
def expected(key, sign):
for el in sign.parameters.values():
if key in el.name:
return True
return False
def cast(key, sign):
for el in sign.parameters.values():
if key in el.name:
return el.annotation
def generate_signature(command, params, sign):
kwargs = {}
cleaned_params = copy.deepcopy(params)
for index, param in enumerate(params):
try:
key, value = param.split("=")
except ValueError:
continue
if expected(key, sign):
kwargs.update({key: cast(key, sign)(value)})
cleaned_params.remove(param)
else:
raise TypeError(
"{cmd}() got an unexpected keyword argument '{param}'".format(
cmd=command, param=key))
if len(cleaned_params) + len(kwargs) == len(sign.parameters.values()):
return cleaned_params, kwargs
args = []
result = []
for el in sign.parameters.values():
if el.name not in kwargs:
args.append(el)
if len(args) == 1:
if args[0].annotation is list:
result.append(cleaned_params)
else:
result.extend(cleaned_params)
return result, kwargs
class TestClass:
def add(arg1 : str, arg2 : str, expire : int=0, noreply : bool=True):
print(arg1)
print(arg2)
print(expire)
print(noreply)
def get_many(arg1 : list, expire : int=0, noreply : bool=True):
print(arg1)
print(expire)
print(noreply)
def fail(arg1 : int, expire : int=0, noreply : bool=True):
print(arg1)
print(expire)
print(noreply)
test_add = "add test value expire=1 noreply=True"
extract = test_add.split()
print(extract)
obj = TestClass
sign = signature(obj.add)
print(sign.parameters.values())
args, kwargs = generate_signature(extract[0], extract[1:], sign)
obj.add(*args, **kwargs)
sign = signature(obj.get_many)
print(sign.parameters.values())
args, kwargs = generate_signature(extract[0], extract[1:], sign)
obj.get_many(*args, **kwargs)
sign = signature(obj.fail)
print(sign.parameters.values())
args, kwargs = generate_signature(extract[0], extract[1:], sign)
obj.fail(*args, **kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment