當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python contextlib.ContextDecorator用法及代碼示例


用法:

class contextlib.ContextDecorator

使上下文管理器也可以用作裝飾器的基類。

ContextDecorator 繼承的上下文管理器必須照常實現__enter____exit____exit__ 即使在用作裝飾器時也保留其可選的異常處理。

ContextDecoratorcontextmanager() 使用,因此您會自動獲得此函數。

ContextDecorator 的示例:

from contextlib import ContextDecorator

class mycontext(ContextDecorator):
    def __enter__(self):
        print('Starting')
        return self

    def __exit__(self, *exc):
        print('Finishing')
        return False

>>> @mycontext()
... def function():
...     print('The bit in the middle')
...
>>> function()
Starting
The bit in the middle
Finishing

>>> with mycontext():
...     print('The bit in the middle')
...
Starting
The bit in the middle
Finishing

對於以下形式的任何構造,此更改隻是語法糖:

def f():
    with cm():
        # Do stuff

ContextDecorator 讓您改為編寫:

@cm()
def f():
    # Do stuff

它清楚地表明cm 適用於整個函數,而不僅僅是其中的一部分(並且保存縮進級別也很好)。

已經有一個基類的現有上下文管理器可以通過使用ContextDecorator 作為一個混合類來擴展:

from contextlib import ContextDecorator

class mycontext(ContextBaseClass, ContextDecorator):
    def __enter__(self):
        return self

    def __exit__(self, *exc):
        return False

注意

由於裝飾函數必須能夠被多次調用,因此底層上下文管理器必須支持在多個 with 語句中使用。如果不是這種情況,則應使用函數內部帶有顯式 with 語句的原始構造。

3.2 版中的新函數。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 contextlib.ContextDecorator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。