Как мне разобрать AST в Python, чтобы найти только переменные - PullRequest
0 голосов
/ 29 апреля 2020

Я собираюсь создать крайне ограниченный лямбда-процессор, представленный пользователями. Для этого я использую следующий код:

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"

Что я делаю не так?

...