code --- Lớp cơ sở thông dịch viên

Source code: Lib/code.py


Mô-đun code cung cấp các phương tiện để triển khai các vòng lặp đọc-đánh giá-in trong Python. Hai lớp và chức năng tiện lợi được bao gồm có thể được sử dụng để xây dựng các ứng dụng cung cấp lời nhắc thông dịch tương tác.

class code.InteractiveInterpreter(locals=None)

Lớp này xử lý trạng thái phân tích cú pháp và trình thông dịch (không gian tên của người dùng); nó không xử lý việc đệm đầu vào hoặc nhắc nhở hoặc đặt tên tệp đầu vào (tên tệp luôn được truyền rõ ràng). Đối số locals tùy chọn chỉ định ánh xạ để sử dụng làm không gian tên trong đó mã sẽ được thực thi; nó mặc định là một từ điển mới được tạo với khóa '__name__' được đặt thành '__console__' và khóa '__doc__' được đặt thành None.

Lưu ý rằng các đối tượng hàm và lớp được tạo trong phiên bản InteractiveInterpreter sẽ thuộc về không gian tên được chỉ định bởi locals. Chúng chỉ có thể được chọn nếu locals là không gian tên của mô-đun hiện có.

class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)

Mô phỏng chặt chẽ hành vi của trình thông dịch Python tương tác. Lớp này được xây dựng trên InteractiveInterpreter và thêm lời nhắc bằng cách sử dụng sys.ps1sys.ps2 quen thuộc cũng như bộ đệm đầu vào. Nếu local_exit là đúng, exit()quit() trong bảng điều khiển sẽ không tăng SystemExit mà thay vào đó quay lại mã gọi.

Thay đổi trong phiên bản 3.13: Đã thêm tham số local_exit.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

Chức năng tiện lợi để chạy vòng lặp đọc-đánh giá-in. Điều này tạo ra một phiên bản mới của InteractiveConsole và đặt readfunc được sử dụng làm phương thức InteractiveConsole.raw_input(), nếu được cung cấp. Nếu local được cung cấp, nó sẽ được chuyển tới hàm tạo InteractiveConsole để sử dụng làm vùng tên mặc định cho vòng lặp trình thông dịch. Nếu local_exit được cung cấp, nó sẽ được chuyển tới hàm tạo InteractiveConsole. Sau đó, phương thức interact() của phiên bản sẽ được chạy với bannerexitmsg được chuyển dưới dạng biểu ngữ và thông báo thoát để sử dụng, nếu được cung cấp. Đối tượng console sẽ bị loại bỏ sau khi sử dụng.

Thay đổi trong phiên bản 3.6: Đã thêm tham số exitmsg.

Thay đổi trong phiên bản 3.13: Đã thêm tham số local_exit.

code.compile_command(source, filename='<input>', symbol='single')

Hàm này hữu ích cho các chương trình muốn mô phỏng vòng lặp chính của trình thông dịch Python (còn gọi là vòng lặp đọc-eval-print). Phần khó khăn là xác định khi nào người dùng đã nhập một lệnh chưa hoàn chỉnh, lệnh này có thể được hoàn thành bằng cách nhập thêm văn bản (trái ngược với lệnh hoàn chỉnh hoặc lỗi cú pháp). Hàm almost này luôn đưa ra quyết định giống như vòng lặp chính của trình thông dịch thực.

source là chuỗi nguồn; filename là tên tệp tùy chọn mà nguồn được đọc, mặc định là '<input>'; và symbol là ký hiệu bắt đầu ngữ pháp tùy chọn, phải là 'single' (mặc định), 'eval' hoặc 'exec'.

Trả về một đối tượng mã (giống như compile(source, filename, symbol)) nếu lệnh hoàn chỉnh và hợp lệ; None nếu lệnh không đầy đủ; tăng SyntaxError nếu lệnh hoàn tất và có lỗi cú pháp hoặc tăng OverflowError hoặc ValueError nếu lệnh chứa chữ không hợp lệ.

Đối tượng phiên dịch tương tác

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

Biên dịch và chạy một số nguồn trong trình thông dịch. Các đối số giống như đối với compile_command(); mặc định cho filename'<input>' và cho symbol'single'. Một trong nhiều điều có thể xảy ra:

Giá trị trả về có thể được sử dụng để quyết định nên sử dụng sys.ps1 hay sys.ps2 để nhắc dòng tiếp theo.

InteractiveInterpreter.runcode(code)

Thực thi một đối tượng mã. Khi một ngoại lệ xảy ra, showtraceback() được gọi để hiển thị dấu vết. Tất cả các ngoại lệ đều bị bắt ngoại trừ SystemExit, được phép phổ biến.

Lưu ý về KeyboardInterrupt: ngoại lệ này có thể xảy ra ở nơi khác trong mã này và không phải lúc nào cũng có thể phát hiện được. Người gọi nên chuẩn bị để đối phó với nó.

InteractiveInterpreter.showsyntaxerror(filename=None)

Hiển thị lỗi cú pháp vừa xảy ra. Điều này không hiển thị dấu vết ngăn xếp vì không có lỗi cú pháp. Nếu filename được cung cấp, nó sẽ được đưa vào ngoại lệ thay vì tên tệp mặc định do trình phân tích cú pháp của Python cung cấp, vì nó luôn sử dụng '<string>' khi đọc từ một chuỗi. Đầu ra được viết bằng phương pháp write().

InteractiveInterpreter.showtraceback()

Hiển thị ngoại lệ vừa xảy ra. Chúng tôi xóa mục ngăn xếp đầu tiên vì nó nằm trong quá trình triển khai đối tượng trình thông dịch. Đầu ra được viết bằng phương pháp write().

Thay đổi trong phiên bản 3.5: Truy nguyên chuỗi đầy đủ được hiển thị thay vì chỉ truy nguyên chính.

InteractiveInterpreter.write(data)

Viết một chuỗi vào luồng lỗi tiêu chuẩn (sys.stderr). Các lớp dẫn xuất nên ghi đè lên điều này để cung cấp khả năng xử lý đầu ra phù hợp khi cần.

Đối tượng bảng điều khiển tương tác

Lớp InteractiveConsole là lớp con của InteractiveInterpreter và do đó cung cấp tất cả các phương thức của đối tượng trình thông dịch cũng như các tính năng bổ sung sau.

InteractiveConsole.interact(banner=None, exitmsg=None)

Mô phỏng chặt chẽ bảng điều khiển Python tương tác. Đối số banner tùy chọn chỉ định biểu ngữ sẽ in trước lần tương tác đầu tiên; theo mặc định, nó in một biểu ngữ tương tự như biểu ngữ được trình thông dịch Python tiêu chuẩn in, theo sau là tên lớp của đối tượng console trong ngoặc đơn (để không nhầm lẫn điều này với trình thông dịch thực sự - vì nó rất gần!).

Đối số exitmsg tùy chọn chỉ định thông báo thoát được in khi thoát. Truyền chuỗi trống để chặn thông báo thoát. Nếu exitmsg không được cung cấp hoặc None, một thông báo mặc định sẽ được in.

Thay đổi trong phiên bản 3.4: Để ngăn việc in bất kỳ biểu ngữ nào, hãy chuyển một chuỗi trống.

Thay đổi trong phiên bản 3.6: In thông báo thoát khi thoát.

InteractiveConsole.push(line)

Đẩy một dòng văn bản nguồn tới trình thông dịch. Dòng không được có dòng mới ở cuối; nó có thể có dòng mới nội bộ. Dòng này được thêm vào bộ đệm và phương thức runsource() của trình thông dịch được gọi với nội dung được nối của bộ đệm làm nguồn. Nếu điều này cho thấy lệnh đã được thực thi hoặc không hợp lệ thì bộ đệm sẽ được đặt lại; nếu không, lệnh không đầy đủ và bộ đệm vẫn được giữ nguyên sau khi dòng được nối thêm. Giá trị trả về là True nếu cần thêm đầu vào, False nếu dòng được xử lý theo cách nào đó (điều này giống như runsource()).

InteractiveConsole.resetbuffer()

Xóa mọi văn bản nguồn chưa được xử lý khỏi bộ đệm đầu vào.

InteractiveConsole.raw_input(prompt='')

Viết lời nhắc và đọc một dòng. Dòng trả về không bao gồm dòng mới ở cuối. Khi người dùng nhập dãy phím EOF, EOFError sẽ được nâng lên. Việc triển khai cơ sở đọc từ sys.stdin; một lớp con có thể thay thế điều này bằng một cách triển khai khác.