changes
This commit is contained in:
parent
61c281b16d
commit
a67054f2e4
|
@ -1,32 +0,0 @@
|
||||||
from DBHelper.MongoHelperInstance import DB_TEST
|
|
||||||
|
|
||||||
|
|
||||||
class TextCodeExecutor(object):
|
|
||||||
code = ""
|
|
||||||
params = ""
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
|
|
||||||
code_text = DB_TEST.find_single_column(
|
|
||||||
"模型数据",
|
|
||||||
"计算函数",
|
|
||||||
{"函数ID": "I1JxzQef"},
|
|
||||||
"方法"
|
|
||||||
)
|
|
||||||
|
|
||||||
code_text
|
|
||||||
eval(code_text)
|
|
||||||
|
|
||||||
code_text_01 = """
|
|
||||||
def eval_operating_margin(arg0, arg1, arg2, arg3):
|
|
||||||
try:
|
|
||||||
value = ((arg0 - arg1 - arg2) / arg3) * 100
|
|
||||||
value = round(value, 2)
|
|
||||||
operating_margin = value
|
|
||||||
return operating_margin
|
|
||||||
except TypeError:
|
|
||||||
return None
|
|
||||||
except ZeroDivisionError:
|
|
||||||
return None
|
|
||||||
"""
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
from DBHelper.MongoHelperInstance import DB_TEST
|
||||||
|
from Utils.ErrorUtil import JustThrowError
|
||||||
|
|
||||||
|
|
||||||
|
class PythonCodeExecutor(object):
|
||||||
|
|
||||||
|
def __init__(self, func_name, func_text, params):
|
||||||
|
self.func_name = ExecutorUtils.check_func_name(func_name)
|
||||||
|
self.func_text = ExecutorUtils.check_code(func_text)
|
||||||
|
self.params = ExecutorUtils.check_params(params)
|
||||||
|
self.result = self.impl()
|
||||||
|
|
||||||
|
def impl(self):
|
||||||
|
try:
|
||||||
|
exec(self.func_text)
|
||||||
|
return eval("{func_name}({params})".format(func_name=self.func_name, params=self.params))
|
||||||
|
except Exception:
|
||||||
|
raise JustThrowError("代码执行失败")
|
||||||
|
|
||||||
|
|
||||||
|
class ExecutorUtils(object):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def check_func_name(func_name):
|
||||||
|
if type(func_name) != str:
|
||||||
|
raise JustThrowError("方法名称不符合文本格式")
|
||||||
|
|
||||||
|
return func_name
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def check_code(code_text):
|
||||||
|
if type(code_text) != str:
|
||||||
|
raise JustThrowError("代码不符合文本格式")
|
||||||
|
|
||||||
|
# 禁止使用import、eval、exec
|
||||||
|
ban_words = ["import", "eval", "exec"]
|
||||||
|
for ban_word in ban_words:
|
||||||
|
if ban_word in code_text:
|
||||||
|
raise JustThrowError("代码中带有非法字符")
|
||||||
|
|
||||||
|
return code_text
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def check_params(input_params):
|
||||||
|
if type(input_params) != dict:
|
||||||
|
raise JustThrowError("传入参数不符合字典格式")
|
||||||
|
|
||||||
|
return_params = ""
|
||||||
|
|
||||||
|
for item in input_params.items():
|
||||||
|
return_params = return_params + ("{}={}, ".format(item[0], item[1]))
|
||||||
|
|
||||||
|
return_params = return_params[:-2]
|
||||||
|
|
||||||
|
return return_params
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
code_t = DB_TEST.find_single_column(
|
||||||
|
"模型数据",
|
||||||
|
"计算函数",
|
||||||
|
{"函数ID": "I1JxzQef"},
|
||||||
|
"方法"
|
||||||
|
)
|
||||||
|
|
||||||
|
inp = {
|
||||||
|
"arg0": 1,
|
||||||
|
"arg1": 2,
|
||||||
|
"arg2": 3,
|
||||||
|
"arg3": 4
|
||||||
|
}
|
||||||
|
|
||||||
|
e = PythonCodeExecutor("cal_operating_margin", code_t, inp)
|
||||||
|
|
||||||
|
print(e.result)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue