Trình quản lý bối cảnh của Python rất tốt cho việc quản lý tài nguyên và ngăn chặn việc truyền bá các bản tóm tắt bị rò rỉ. Có thể bạn đã sử dụng nó khi mở tệp hoặc kết nối cơ sở dữ liệu. Thông thường nó bắt đầu bằng một câu lệnh
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
4 như thế nàywith open["file.txt", "wt"] as f:
f.write["contents go here"]
Trong trường hợp trên,
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
5 sẽ tự động đóng khi luồng thực thi vượt ra ngoài phạm vi. Điều này tương đương với việc viếttry:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
Viết trình quản lý bối cảnh tùy chỉnh
Để viết trình quản lý bối cảnh tùy chỉnh, bạn cần tạo một lớp bao gồm các phương thức
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
6 và with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
7. Hãy tạo lại một trình quản lý bối cảnh tùy chỉnh sẽ thực hiện quy trình làm việc tương tự như trênclass CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
Bạn có thể sử dụng lớp trên giống như trình quản lý bối cảnh thông thường
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
Từ Trình tạo đến Trình quản lý ngữ cảnh
Tạo trình quản lý bối cảnh bằng cách viết một lớp với các phương thức
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
6 và with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
7, không khó. Tuy nhiên, bạn có thể đạt được độ ngắn gọn tốt hơn bằng cách xác định chúng bằng cách sử dụng trình trang trí with open["file.txt", "wt"] as f:
f.write["contents go here"]
00. Trình trang trí này chuyển đổi hàm tạo thành trình quản lý bối cảnh. Kế hoạch chi tiết để tạo trình quản lý bối cảnh trang trí giống như thế nàywith open["file.txt", "wt"] as f:
f.write["contents go here"]
0Khi bạn sử dụng trình quản lý ngữ cảnh với câu lệnh
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
4with open["file.txt", "wt"] as f:
f.write["contents go here"]
3Nó tạm dịch là
with open["file.txt", "wt"] as f:
f.write["contents go here"]
4Mã thiết lập đi trước khối
with open["file.txt", "wt"] as f:
f.write["contents go here"]
02. Lưu ý điểm mà máy phát điện mang lại. Đây là nơi khối mã lồng trong câu lệnh with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
4 được thực thi. Sau khi hoàn thành khối mã, trình tạo sẽ được tiếp tục. Nếu một ngoại lệ chưa được xử lý xảy ra trong khối, nó sẽ được kích hoạt lại bên trong trình tạo tại điểm xảy ra with open["file.txt", "wt"] as f:
f.write["contents go here"]
04 và sau đó khối with open["file.txt", "wt"] as f:
f.write["contents go here"]
05 được thực thi. Nếu không có ngoại lệ chưa được xử lý nào xảy ra, mã sẽ tiếp tục đến khối with open["file.txt", "wt"] as f:
f.write["contents go here"]
05 nơi bạn chạy mã dọn dẹp của mìnhHãy triển khai trình quản lý ngữ cảnh
with open["file.txt", "wt"] as f:
f.write["contents go here"]
07 tương tự với trình trang trí with open["file.txt", "wt"] as f:
f.write["contents go here"]
08with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
2Bây giờ sử dụng nó giống như trước đây
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
Viết Trình quản lý bối cảnh làm Người trang trí
Bạn cũng có thể sử dụng trình quản lý ngữ cảnh làm trình trang trí. Để làm được như vậy, trong khi định nghĩa lớp, bạn phải kế thừa từ lớp
with open["file.txt", "wt"] as f:
f.write["contents go here"]
09. Hãy tạo một trình trang trí with open["file.txt", "wt"] as f:
f.write["contents go here"]
30 sẽ được áp dụng cho chức năng mở tệp. Người trang trí sẽ- In mô tả chức năng do người dùng cung cấp
- In thời gian cần thiết để chạy chức năng
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
6Bạn có thể sử dụng trang trí như thế này
try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
0Sử dụng chức năng như thế này sẽ trở lại
try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
1try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
2Bạn cũng có thể tạo trình trang trí tương tự thông qua trình trang trí
with open["file.txt", "wt"] as f:
f.write["contents go here"]
00try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
3Bối cảnh lồng nhau
Bạn có thể lồng nhiều trình quản lý ngữ cảnh để quản lý đồng thời các tài nguyên. Hãy xem xét người quản lý giả sau đây
try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
4try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
5Chú ý đơn hàng họ đang đóng. Trình quản lý bối cảnh được coi là một ngăn xếp và phải được thoát theo thứ tự ngược lại mà chúng được nhập vào. Nếu một ngoại lệ xảy ra, thứ tự này quan trọng, vì bất kỳ người quản lý bối cảnh nào cũng có thể chặn ngoại lệ, tại thời điểm đó, những người quản lý còn lại thậm chí sẽ không nhận được thông báo về điều này. Phương pháp
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
7 cũng được phép đưa ra một ngoại lệ khác và các trình quản lý bối cảnh khác sau đó sẽ có thể xử lý ngoại lệ mới đóKết hợp nhiều trình quản lý ngữ cảnh
Bạn cũng có thể kết hợp nhiều trình quản lý bối cảnh. Hãy xem xét hai nhà quản lý này
try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
6Bây giờ kết hợp cả hai bằng cách sử dụng cú pháp trang trí. Hàm sau đây nhận các trình quản lý xác định ở trên
with open["file.txt", "wt"] as f:
f.write["contents go here"]
33 và with open["file.txt", "wt"] as f:
f.write["contents go here"]
34 và trả về một trình quản lý ngữ cảnh kết hợp with open["file.txt", "wt"] as f:
f.write["contents go here"]
35try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
7Điều này có thể được sử dụng như
try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
8try:
f = open["file.txt", "wt"]
text = f.write["contents go here"]
finally:
f.close[]
9Nếu bạn có nhiều trình quản lý bối cảnh khác nhau và bạn muốn kết hợp chúng một cách duyên dáng, thì
with open["file.txt", "wt"] as f:
f.write["contents go here"]
36 sẵn sàng trợ giúp. Hãy viết lại trình quản lý ngữ cảnh with open["file.txt", "wt"] as f:
f.write["contents go here"]
35 bằng cách sử dụng with open["file.txt", "wt"] as f:
f.write["contents go here"]
38. Hàm này lấy các trình quản lý ngữ cảnh riêng lẻ và các đối số của chúng dưới dạng các bộ và trả về trình quản lý kết hợpclass CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
0class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
1class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
2with open["file.txt", "wt"] as f:
f.write["contents go here"]
38 cũng có thể được sử dụng trong trường hợp bạn muốn quản lý nhiều tài nguyên một cách dễ dàng. Ví dụ, giả sử, bạn cần tạo một danh sách từ nội dung của nhiều tệp trong một thư mục. Hãy xem cách bạn có thể làm như vậy trong khi tránh tình trạng rò rỉ bộ nhớ ngoài ý muốn với tính năng quản lý tài nguyên mạnh mẽclass CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
3Sử dụng trình quản lý ngữ cảnh để tạo phiên SQLAlchemy
Nếu bạn đã quen thuộc với SQLALchemy, bộ công cụ SQL của Python và Trình ánh xạ quan hệ đối tượng, thì bạn có thể biết cách sử dụng
with open["file.txt", "wt"] as f:
f.write["contents go here"]
40 để chạy truy vấn. Một with open["file.txt", "wt"] as f:
f.write["contents go here"]
40 về cơ bản biến bất kỳ truy vấn nào thành một giao dịch và biến nó thành nguyên tử. Trình quản lý bối cảnh có thể giúp bạn viết một phiên giao dịch theo cách rất tao nhã. Quy trình truy vấn cơ bản trong SQLAlchemy có thể trông như thế nàyclass CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
4Đoạn trích trên tạo một kết nối
with open["file.txt", "wt"] as f:
f.write["contents go here"]
42 trong bộ nhớ và một hàm with open["file.txt", "wt"] as f:
f.write["contents go here"]
43 với trình quản lý ngữ cảnh. Hàm session_scope đảm nhiệm việc tự động cam kết và khôi phục trong trường hợp ngoại lệ. Hàm with open["file.txt", "wt"] as f:
f.write["contents go here"]
43 có thể được sử dụng để chạy các truy vấn theo cách sauclass CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
5Trừu tượng Away Xử lý ngoại lệ Quái dị với Trình quản lý ngữ cảnh
Đây là trường hợp sử dụng trình quản lý bối cảnh yêu thích tuyệt đối của tôi. Giả sử bạn muốn viết một hàm nhưng muốn loại bỏ logic xử lý ngoại lệ. Logic xử lý ngoại lệ với ghi nhật ký phức tạp thường có thể làm xáo trộn logic cốt lõi của chức năng của bạn. Bạn có thể viết một trình quản lý bối cảnh kiểu trang trí sẽ xử lý các ngoại lệ cho bạn và tách các mã bổ sung này khỏi logic chính của bạn. Hãy viết một trình trang trí sẽ xử lý đồng thời
with open["file.txt", "wt"] as f:
f.write["contents go here"]
45 và with open["file.txt", "wt"] as f:
f.write["contents go here"]
46class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
6Bây giờ hãy sử dụng chức năng này trong một chức năng xảy ra các ngoại lệ này
class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
7class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
8class CustomFileOpen:
"""Custom context manager for opening files."""
def __init__[self, filename, mode]:
self.filename = filename
self.mode = mode
def __enter__[self]:
self.f = open[self.filename, self.mode]
return self.f
def __exit__[self, *args]:
self.f.close[]
9Bạn có thể thấy rằng người trang trí ________ 147 đang làm công việc nặng nhọc cho bạn. Khá gọn gàng, phải không?
Ví dụ sau đây là một ví dụ phức tạp hơn về việc sử dụng trình quản lý bối cảnh để tách biệt sự quái dị trong việc xử lý lỗi của bạn khỏi logic chính. Nó cũng ẩn các logic ghi nhật ký phức tạp khỏi phương thức chính
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
0Điều này sẽ trở lại
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
1Các tham số liên tục trên các yêu cầu http với Trình quản lý ngữ cảnh
Một trường hợp sử dụng tuyệt vời khác cho trình quản lý ngữ cảnh là tạo các tham số liên tục trên nhiều yêu cầu http. Thư viện
with open["file.txt", "wt"] as f:
f.write["contents go here"]
48 của Python có một đối tượng with open["file.txt", "wt"] as f:
f.write["contents go here"]
40 sẽ cho phép bạn dễ dàng đạt được điều này. Vì vậy, nếu bạn đang thực hiện một số yêu cầu đối với cùng một máy chủ, thì kết nối TCP bên dưới sẽ được sử dụng lại, điều này có thể dẫn đến hiệu suất tăng đáng kể. Ví dụ sau được lấy trực tiếp từ tài liệu chính thức của yêu cầu. Hãy duy trì một số cookie theo yêu cầuwith CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
2Điều này sẽ hiển thị
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
3Nhận xét
Tất cả các đoạn mã được cập nhật cho python
with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
20. Để tránh dư thừa, tôi đã cố ý loại trừ các ví dụ về câu lệnh lồng nhau và hàm with CustomFileOpen["file.txt", "wt"] as f:
f.write["contents go here"]
21 hiện không dùng nữa để tạo trình quản lý ngữ cảnh lồng nhau