Cách sử dụng Trình quản lý bối cảnh trong Python (có câu lệnh)

Tìm hiểu cách trình quản lý bối cảnh hoạt động trong Python. Nắm vững câu lệnh with, quản lý tài nguyên hệ thống và viết trình quản lý bối cảnh tùy chỉnh.

Hãy thử Giải pháp này trong Trình chỉnh sửa

Tổng quan

Quản lý đúng cách các tài nguyên bên ngoài—chẳng hạn như đóng các thẻ xử lý tệp, ngắt kết nối cơ sở dữ liệu và giải phóng các khóa luồng—là điều cần thiết để xây dựng phần mềm đáng tin cậy, sẵn sàng sản xuất. Việc không giải phóng tài nguyên có thể dẫn đến rò rỉ bộ nhớ, lỗi khóa tệp và ứng dụng bị treo.

Câu lệnh `with` của Python đơn giản hóa việc dọn dẹp tài nguyên bằng cách tạo trình quản lý bối cảnh. Trình quản lý bối cảnh đảm bảo rằng các hành động dọn dẹp được thực thi tự động khi điều khiển rời khỏi khối, ngay cả khi mã đưa ra ngoại lệ hoặc thoát sớm. Điều này giúp loại bỏ sự cần thiết của các khối `thử cuối cùng` dài dòng, lặp đi lặp lại.

Mặc dù trình quản lý bối cảnh thường được liên kết nhiều nhất với các hoạt động tích hợp sẵn như `open()`, nhưng bạn có thể dễ dàng thiết kế trình quản lý bối cảnh tùy chỉnh của riêng mình. Bạn có thể xây dựng chúng bằng cách tạo một lớp thực hiện các phương thức ma thuật `__enter__` và `__exit__` hoặc bằng cách viết một hàm tạo được trang trí bằng trình trang trí `contextlib.contextmanager`.

Đầu ra mã & thực thi

Tập lệnh này trình bày cách viết các trình quản lý bối cảnh tùy chỉnh bằng Python bằng cách sử dụng các triển khai lớp và trình trang trí contextlib.

from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Đầu ra thiết bị đầu cuối
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Triển khai từng bước

  • Sử dụng câu lệnh with khi mở tệp, cơ sở dữ liệu hoặc khóa để đảm bảo an toàn tài nguyên.
  • Xác định trình quản lý bối cảnh tùy chỉnh bằng cách sử dụng các lớp có phương thức ma thuật __enter__ và __exit__.
  • Sử dụng trình trang trí @contextlib.contextmanager trên hàm tạo như một giải pháp thay thế dựa trên hàm đơn giản hơn.
  • Đặt các hành động đóng tài nguyên bên trong khối dọn dẹp để đảm bảo chúng chạy ngay cả khi xảy ra lỗi.

Câu hỏi thường gặp

Phương thức __exit__ nhận được những tham số nào?

Phương thức __exit__ nhận ba đối số biểu thị chi tiết ngoại lệ nếu một đối số được đưa ra: exc_type (loại ngoại lệ), exc_val (giá trị ngoại lệ) và exc_tb (traceback). Nếu không có lỗi xảy ra, cả ba đều được chuyển thành Không có.

Trình quản lý bối cảnh có thể loại bỏ các ngoại lệ không?

Vâng. Nếu phương thức __exit__ trả về một giá trị trung thực (như True), Python sẽ loại bỏ ngoại lệ đó và việc thực thi tiếp tục sau khối with. Nếu nó trả về Sai, ngoại lệ sẽ được đưa ra bình thường.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.