Trình quản lý bối cảnh yêu cầu Python

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ày

with 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ết

try:
    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ên

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[]

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ày

with open["file.txt", "wt"] as f:
    f.write["contents go here"]
0

Khi 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"]
4

with open["file.txt", "wt"] as f:
    f.write["contents go here"]
3

Nó tạm dịch là

with open["file.txt", "wt"] as f:
    f.write["contents go here"]
4

Mã 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ình

Hã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"]
08

with CustomFileOpen["file.txt", "wt"] as f:
    f.write["contents go here"]
2

Bâ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"]
6

Bạ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[]
0

Sử 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[]
1

try:
    f = open["file.txt", "wt"]
    text = f.write["contents go here"]
finally:
    f.close[]
2

Bạ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"]
00

try:
    f = open["file.txt", "wt"]
    text = f.write["contents go here"]
finally:
    f.close[]
3

Bố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[]
4

try:
    f = open["file.txt", "wt"]
    text = f.write["contents go here"]
finally:
    f.close[]
5

Chú ý đơ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[]
6

Bâ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"]
35

try:
    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[]
8

try:
    f = open["file.txt", "wt"]
    text = f.write["contents go here"]
finally:
    f.close[]
9

Nế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ợp

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[]
0

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[]
1

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[]
2

with 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[]
3

Sử 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à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[]
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 sau

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[]
5

Trừ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"]
46

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[]
6

Bâ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[]
7

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[]
8

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[]
9

Bạ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"]
1

Cá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ầu

with 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"]
3

Nhậ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

Trình quản lý ngữ cảnh trong Python là gì?

Trình quản lý ngữ cảnh được dùng để thiết lập và loại bỏ các ngữ cảnh tạm thời, thiết lập và giải quyết các cài đặt tùy chỉnh cũng như thu nhận và giải phóng tài nguyên . Hàm open[] để mở tệp là một trong những ví dụ quen thuộc nhất của trình quản lý ngữ cảnh.

Yêu cầu Python có sử dụng https không?

Yêu cầu xác minh chứng chỉ SSL cho yêu cầu HTTPS , giống như trình duyệt web.

__ nhập __ trong Python là gì?

__enter__ và [__exit__] đều là các phương thức được gọi khi nhập và thoát khỏi phần thân của "câu lệnh with" [PEP .

Làm cách nào để nhận Phiên từ yêu cầu trong Python?

Để lấy đối tượng Phiên trong Yêu cầu Python, bạn cần gọi các yêu cầu. Phương thức phiên[] . Đối tượng Phiên có thể lưu trữ các tham số như cookie và tiêu đề HTTP.

Chủ Đề