のようなことをすることは可能ですか
c = MyObj()
c.eval("func1(42)+func2(24)")
Python..ieでは、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, '<string>', mode='eval'))