Tôi đã thử nghiệm với AST trong python. Tôi muốn sửa đổi các phương thức bằng cách chuyển đổi các AST khi chạy.Biên dịch AST python sang phương pháp
Tôi có thể lấy nguồn của phương pháp được biên dịch trước bằng cách sử dụng inspect.getsource()
và Tôi có thể sửa đổi AST theo yêu cầu bằng cách sử dụng AST khách truy cập.
Đây có lẽ là khá ngây thơ, nhưng tôi muốn để có thể biên dịch AST và làm điều gì đó tương tự như:
myClass.method.__func__.__code__ = compile(newAST, '<string>', 'exec')
Nhưng biên dịch sẽ chỉ chấp nhận một AST với một ast.Module như root. Có cách nào để biên dịch chỉ là một ast.FunctionDef, hoặc để lấy đối tượng mã chức năng từ mã mô-đun được biên dịch (và nếu không có)?
Bất kỳ con trỏ nào về thông tin bao gồm loại điều này sẽ được đánh giá cao. Các ví dụ AST mà tôi thấy chỉ đối phó với các biểu thức đơn giản.
Tôi nhận ra rằng tôi cần thực hiện mô-đun trong không gian tên, sau đó tôi có quyền truy cập vào cấu trúc bình thường. Vì vậy, mô hình là:
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__
Nhưng bây giờ tôi có một câu hỏi: Làm thế nào để khe này vào python bình thường quá trình xây dựng để các thay đổi được thực hiện một lần duy nhất, và sau đó nạp từ file pyc?
Vì bạn đã khám phá câu trả lời cho câu hỏi của mình, hãy đăng câu trả lời đó làm câu trả lời và chấp nhận câu trả lời. – cpburnz