2011-08-15 94 views
9

我一直在用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構建過程呢?

+2

既然您發現了您的問題的答案,請將其作爲答案發布並接受。 – cpburnz

回答

1

你不應該在你自己的答案中提出一個新問題,而是爲此創建一個單獨的問題。

請注意,你的第一個和第二個問題也有矛盾。首先,您希望在運行時執行某些操作,之後您希望將它們寫入文件,以便不必一遍又一遍地執行操作。請說明你的目標是如此我們清楚地知道你想要什麼。

這聽起來像你可能只是以及修改您剖析爲Parse a .py file, read the AST, modify it, then write back the modified source code

解釋,那麼你將通過編譯新創建的PY獲得您的PYC文件的文件的AST之後創建一個新的.py文件文件。