我一直在用python試驗ASTs。我想通過在運行時轉換AST來修改方法。編譯python AST到方法
我可以通過使用inspect.getsource()
和 來獲得預編譯方法的來源我可以根據AST訪問者的要求修改AST。
這可能是相當幼稚,但我希望能夠編譯AST和做一個類似於:
myClass.method.__func__.__code__ = compile(newAST, '<string>', 'exec')
但是編譯只接受與ast.Module作爲root AST。 有沒有辦法編譯一個ast.FunctionDef,或從編譯的(和空的)模塊代碼檢索功能代碼對象?
任何指向這類信息的信息指針,將不勝感激。我見過的AST例子只是處理簡單的表達式。
我意識到我只需要在名稱空間中執行模塊,然後我就可以訪問正常的結構。 所以模式是:
src = inspect.getsource(myClass.myMethod)
astFromSrc = ast.parse(unindent(src)) # need to remove extra indent from method
transform(astFromSrc.body) # transform the AST as you need
ast.fix_missing_locations(astFromSrc) # fix up line numbers etc
compiled = compile(astFromSrc, '<string>', 'exec') # compile the module AST
####### From here is the part I was missing
myScope = {} # make an empty namespace
exec compiled in myScope # now myScope contains a proper compiled function
# Now replace the original with the modified version
myClass.myMethod.__func__.__code__ = myScope['myMethod'].__code__
但現在我還有一個問題: ,以便修改一次時進行,之後從.pyc文件文件加載如何插槽進入正常的Python構建過程呢?
既然您發現了您的問題的答案,請將其作爲答案發布並接受。 – cpburnz