Как вы делаете Python 'Eval' только в контексте объекта?
Можно ли сделать что-то вроде
c = MyObj()
c.eval("func1(42)+func2(24)")
в Python ... т.е. чтобы func1 () и func2 () оценивались в рамках объекта 'c' (если бы они были функциями-членами в пределах этого определения класса)? Я могу'сделать простой анализ, так как для моего приложения eval-строки могут быть сколь угодно сложными. Я полагаю, что использование магии с модулем ast могло бы сработать, но из-за недостатка литературы по ast яЯ не уверен, где искать:
import ast
class MyTransformer(ast.NodeTransformer):
def visit_Name(self, node):
# do a generic_visit so that child nodes are processed
ast.NodeVisitor.generic_visit(self, node)
return ast.copy_location(
# do something magical with names that are functions, so that they become
# method calls to a Formula object
newnode,
node
)
class Formula(object):
def LEFT(self, s, n):
return s[:n]
def RIGHT(self, s, n):
return s[0-n:]
def CONCAT(self, *args, **kwargs):
return ''.join([arg for arg in args])
def main():
evalString = "CONCAT(LEFT('Hello', 2), RIGHT('World', 3))"
# we want to emulate something like Formula().eval(evalString)
node = ast.parse(evalString, mode='eval')
MyTransformer().visit(node)
ast.fix_missing_locations(node)
print eval(compile(node, '', mode='eval'))