Я собираюсь создать крайне ограниченный лямбда-процессор, представленный пользователями. Для этого я использую следующий код:
import ast, operator
from math import *
#make a list of safe functions
safe_list = ["math", "lambda"]
# use the list to filter the local namespace
safe_dict = dict([(k, locals().get(k, None)) for k in safe_list])
all_args = []
user_submitted_fxn_example = "d>15"
node = ast.parse(user_submitted_fxn_example, mode="eval")
for elem in ast.walk(node):
if isinstance(elem, ast.Name):
all_args.append(str(elem.id))
lambda_string = f"lambda {','.join(all_args)}: {fxn}"
a = eval(f"lambda {','.join(all_args)}: {fxn}", {"__builtins__": None}, safe_dict)
print(a(11)) # => Correctly reports 'False'
Согласно this , правильный способ построить список переменных для добавления в лямбад - с помощью ast.Name, но когда я делаю следующее, я получаю sin
и x
в качестве имени.
user_submitted_fxn_example = "sin(d)>0.5"
Что я делаю не так?