2017-09-16 16 views
1

誰も私にこの行動に関するアドバイスを与えることができますか?次のコードは正常に動作:Python ASTノードを関数内で実行することはできません

import ast 


node = ast.parse('def nsd(a, b):\n if b == 0: return a \n return nsd(b, a%b)\n\nprint nsd(18,15)') 
obj = compile(node, filename="<ast>", mode="exec") 
exec obj 

しかし、私は関数内に同じ操作を行います。

import ast 


def foo(): 
    node = ast.parse('def nsd(a, b):\n if b == 0: return a \n return nsd(b, a%b)\n\nprint nsd(18,15)') 
    obj = compile(node, filename="<ast>", mode="exec") 
    exec obj 

foo() 

それはエラー発生します

Traceback (most recent call last): 
    File "C:/Users/Vectoun/PycharmProjects/untitled3/test.py", line 9, in <module> 
    foo() 
    File "C:/Users/Vectoun/PycharmProjects/untitled3/test.py", line 7, in foo 
    exec obj 
    File "<ast>", line 5, in <module> 
    File "<ast>", line 3, in nsd 
NameError: global name 'nsd' is not defined 

私が実行できるようにしたいと思いますがこれは関数内にあります。誰もこれを解決する方法を知っていますか?

答えて

0

もし私が間違っていないのであれば、execを使ってもまだスコープにバインドされているということになります。

だから nsd fooの直接スコープのメンバーを行います foo()内ASTのコードを実行中に呼び出しがメソッドを見上げに失敗するので、グローバル方法として nsdを定義する方法の外にASTのコードを実行しています。

あなたはまずグローバルとしてnsdを定義することによって、それを修正することができます:作業溶液のための

import ast 


def foo(): 
    code = """global nsd 
def nsd(a, b): 
    if b == 0: 
     return a 
    return nsd(b, a%b) 
print nsd(18,15) 
    """ 
    node = ast.parse(code) 
    obj = compile(node, filename="<ast>", mode="exec") 
    exec obj 

foo() 
+0

感謝を! – vecta

関連する問題