codeop --- Biên dịch mã Python¶
Source code: Lib/codeop.py
Mô-đun codeop cung cấp các tiện ích mà vòng lặp đọc-eval-in của Python có thể được mô phỏng, như được thực hiện trong mô-đun code. Kết quả là bạn có thể không muốn sử dụng mô-đun một cách trực tiếp; nếu bạn muốn đưa một vòng lặp như vậy vào chương trình của mình thì có lẽ bạn muốn sử dụng mô-đun code để thay thế.
Có hai phần của công việc này:
Có thể biết liệu một dòng đầu vào có hoàn thành câu lệnh Python hay không: nói tóm lại là nên in '
>>>' hay '...' tiếp theo.Ghi nhớ những câu lệnh trong tương lai mà người dùng đã nhập để đầu vào tiếp theo có thể được biên dịch với những câu lệnh này có hiệu lực.
Mô-đun codeop cung cấp cách thực hiện từng việc này và cách thực hiện cả hai việc đó.
Để làm chỉ là trước đây:
- codeop.compile_command(source, filename='<input>', symbol='single')¶
Cố gắng biên dịch source, đây phải là một chuỗi mã Python và trả về một đối tượng mã nếu source là mã Python hợp lệ. Trong trường hợp đó, thuộc tính tên tệp của đối tượng mã sẽ là filename, mặc định là
'<input>'. Trả vềNonenếu source là mã Python hợp lệ not nhưng là tiền tố của mã Python hợp lệ.Nếu có vấn đề với source, một ngoại lệ sẽ được đưa ra.
SyntaxErrorđược nâng lên nếu có cú pháp Python không hợp lệ vàOverflowErrorhoặcValueErrornếu có một chữ không hợp lệ.Đối số symbol xác định xem source được biên dịch dưới dạng câu lệnh (
'single', mặc định), dưới dạng một chuỗi statement ('exec') hay dưới dạng expression ('eval'). Bất kỳ giá trị nào khác sẽ khiếnValueErrorđược nâng lên.Ghi chú
Có thể (nhưng không có khả năng) trình phân tích cú pháp dừng phân tích cú pháp với kết quả thành công trước khi đến cuối nguồn; trong trường hợp này, các ký hiệu ở cuối có thể bị bỏ qua thay vì gây ra lỗi. Ví dụ: dấu gạch chéo ngược theo sau là hai dòng mới có thể được theo sau bởi rác tùy ý. Điều này sẽ được khắc phục khi API cho trình phân tích cú pháp tốt hơn.
- class codeop.Compile¶
Các phiên bản của lớp này có các phương thức
__call__()giống hệt về chữ ký với hàm dựng sẵncompile(), nhưng có điểm khác biệt là nếu phiên bản biên dịch văn bản chương trình có chứa câu lệnh__future__thì phiên bản đó sẽ 'ghi nhớ' và biên dịch tất cả các văn bản chương trình tiếp theo có câu lệnh có hiệu lực.
- class codeop.CommandCompiler¶
Các phiên bản của lớp này có các phương thức
__call__()giống hệt vớicompile_command(); điểm khác biệt là nếu phiên bản biên dịch văn bản chương trình có chứa câu lệnh__future__, thì phiên bản đó sẽ 'ghi nhớ' và biên dịch tất cả văn bản chương trình tiếp theo có câu lệnh có hiệu lực.