2011-08-15 39 views
9

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?

+2

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

Trả lời

1

Bạn không nên đặt câu hỏi mới trong câu trả lời của riêng mình nhưng tạo câu hỏi riêng cho điều đó.

Lưu ý rằng câu hỏi đầu tiên và thứ hai của bạn cũng sắp xếp mâu thuẫn. Trước tiên, bạn muốn làm mọi thứ trong thời gian chạy và sau đó bạn muốn viết chúng vào một tệp để bạn không phải lặp lại nhiều lần. Vui lòng nêu rõ endgoal của bạn để chúng tôi biết rõ bạn muốn gì.

Nghe có vẻ như bạn chỉ có thể cũng tạo ra một file py mới sau khi sửa đổi ast của một tập tin mà bạn phân tích cú pháp như được giải thích trong Parse a .py file, read the AST, modify it, then write back the modified source code

sau đó bạn sẽ nhận được tập tin PYC bạn bằng cách soạn các py mới được tạo tập tin.

Các vấn đề liên quan