Python Contextlib

Fariba Laiq 2023年1月30日
  1. 在 Python 中使用 with 語句作為上下文管理器
  2. 在 Python 中使用函式裝飾器@contextmanager
Python Contextlib

有時,我們會使用一些資源,例如檔案。當我們完成它的工作時,我們開啟它並忘記關閉它。

這是一種不好的編碼習慣,當開啟太多檔案時會產生問題。即使我們不再需要這些資源,該程式也可能無限期地獲取它們。

這種情況會導致記憶體洩漏。為了自動處理這些事情,Python 有上下文管理器。

他們負責管理資源。contextlib 是一個 Python 庫,它使用 with 關鍵字提供資源管理實用程式。

在 Python 中使用 with 語句作為上下文管理器

在 Python 中,with 語句管理資源並處理異常。所以它作為一個上下文管理器工作。

當程式碼到達 with 語句時,它會臨時分配資源。當 with 語句塊完成其執行時,先前獲取的資源將被釋放。

在下面的程式碼中,我們建立並開啟了一個檔案。當控制元件脫離 with 塊時,with 塊中獲取的資源將被釋放。

示例程式碼:

with open("file.txt", "w+") as f:
    print("File Opened")

輸出:

File Opened

我們也可以在我們的程式中包含上下文管理器功能。為此,我們的類必須有方法 __enter__()__exit__()

為了理解上下文管理器的流程,我們使用 print 語句執行了以下程式碼,該語句在控制轉移到相應塊時執行。

示例程式碼:

class MyContextManager:
    def __init__(self):
        print("In init method")

    def __enter__(self):
        print("In enter method")

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("In exit method")


with MyContextManager() as m:
    print("With block")

輸出:

In init method
In enter method
With block
In exit method

在 Python 中使用函式裝飾器@contextmanager

另一種將函式作為上下文管理器的方法是使用函式裝飾器@contextmanager。裝飾器是一個函式,它接受另一個函式作為輸入,擴充套件它的功能/修改它的行為,並返回另一個函式作為輸出。

使用這個裝飾器時,我們不必編寫單獨的類或 __enter__()__exit__() 函式。我們必須從 contextlib 模組匯入上下文管理器。

我們將在函式上方使用@contextmanageryield 關鍵字類似於用於返回值/控制的 return 語句。

yield 關鍵字之前的所有內容都將被視為 __enter__ 部分,而 yield 之後的所有內容將被視為 __exit__ 部分。

示例程式碼:

from contextlib import contextmanager


@contextmanager
def MyContextManager():
    print("In enter method")
    yield
    print("In exit method")


with MyContextManager() as m:
    print("With block")

輸出:

In enter method
With block
In exit method
作者: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn