Last active
March 4, 2019 18:23
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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