成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 進階: 上下文管理器

開發
上下文管理器通過封裝資源管理邏輯,顯著提升代碼的可讀性和健壯性。掌握其自定義方法和高級特性,能讓你編寫更優雅、安全的 Python 代碼。?

在Python中,上下文管理器(Context Manager)是一種用于管理資源(如文件、網絡連接、鎖等)的對象,它確保在使用完資源后能夠正確釋放或清理資源。

上下文管理器通常與with語句一起使用。一個著名的例子是 with open() 語句:

with open('notes.txt', 'w') as f:
    f.write('some todo...')

這將打開一個文件,并確保在程序執行離開 with 語句的上下文之后自動將其關閉。

它還處理異常,并確保即使在發生異常的情況下也能正確關閉文件。 在內部,上面的代碼翻譯成這樣的東西:

f = open('notes.txt', 'w')
try:
    f.write('some todo...')
finally:
    f.close()

應用場景

  • 成對操作:打開/關閉、獲取/釋放、開始/結束
  • 資源清理:需要確保資源釋放(即使發生異常)
  • 狀態切換:需要臨時修改全局狀態后恢復
  • 異常處理:需要統一處理特定錯誤
  • 性能監控:需要精確測量代碼塊執行時間

自定義上下文管理器

  • __enter__():進入上下文時調用,返回資源對象
  • __exit__():退出上下文時調用,處理異常和清理
class ManagedFile:
    def __init__(self, filename):
        print('init', filename)
        self.filename = filename

    def __enter__(self):
        print('enter')
        self.file = open(self.filename, 'w')
        return self.file

    def __exit__(self, exc_type, exc_value, exc_traceback):
        if self.file:
            self.file.close()
        print('exit')

with ManagedFile('notes.txt') as f:
    print('doing stuff...')
    f.write('some todo...')

contextlib 裝飾器

除了編寫類,我們還可以編寫一個生成器函數,并使用 contextlib.contextmanager 裝飾器對其進行裝飾。 然后,我們也可以使用 with 語句調用該函數。

對于這種方法,函數必須在 try 語句中 yield 資源,并且釋放資源的 __exit__ 方法的所有內容現在都在相應的 finally 語句內。

from contextlib import contextmanager

@contextmanager
def file_manager(filename, mode):
    file = open(filename, mode)  # 相當于 __enter__
    try:
        yield file  # 返回資源對象
    finally:
        file.close()  # 相當于 __exit__

# 使用示例
with file_manager("test.txt", "w") as f:
    f.write("Hello Context Manager!")

高級功能

(1) 異常處理

在 __exit__() 中可通過參數獲取異常信息:

  • exc_type:異常類型
  • exc_val:異常值
  • exc_tb:異常堆棧
def __exit__(self, exc_type, exc_val, exc_tb):
    if exc_type:
        print(f"Exception handled: {exc_val}")
    self.cleanup()
    return True  # 返回 True 表示異常已被處理

(2) 嵌套上下文管理器

with open("file1.txt") as f1, open("file2.txt") as f2:
    data1 = f1.read()
    data2 = f2.read()
    # 自動關閉兩個文件

(3) 異步上下文管理器

class AsyncConnection:
    async def __aenter__(self):
        await self.connect()
        return self
    
    async def __aexit__(self, exc_type, exc, tb):
        await self.close()

# 使用
async with AsyncConnection() as conn:
    await conn.send_data()

上下文管理器通過封裝資源管理邏輯,顯著提升代碼的可讀性和健壯性。掌握其自定義方法和高級特性,能讓你編寫更優雅、安全的 Python 代碼。

責任編輯:趙寧寧 來源: 程序員老朱
相關推薦

2014-04-04 10:27:00

Python上下文管理器

2022-06-29 14:15:01

Python計時器上下文管理器

2022-11-03 08:29:32

編程管理器協議

2023-11-16 08:46:27

上下文管理器Python

2024-11-14 09:00:00

Python上下文管理器

2023-12-10 13:37:23

Python編程上下文管理

2017-05-11 14:00:02

Flask請求上下文應用上下文

2022-09-14 13:13:51

JavaScript上下文

2012-12-31 10:01:34

SELinuxSELinux安全

2021-11-03 16:41:30

Windows 11操作系統微軟

2022-09-15 08:01:14

繼承基礎設施基礎服務

2020-07-24 10:00:00

JavaScript執行上下文前端

2021-07-26 07:47:36

Cpu上下文進程

2023-07-11 10:02:23

2024-09-30 14:10:00

2017-12-17 17:01:23

限界上下文系統模型

2022-10-28 16:24:33

Context上下文鴻蒙

2025-03-18 08:14:05

2025-04-03 07:33:56

2011-06-28 10:55:02

QT QMainWindo 內存泄露
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线一区二区三区 | 日本一二三区高清 | 久久久一区二区三区 | 色视频www在线播放国产人成 | 丁香婷婷在线视频 | 成人精品国产免费网站 | 久久精品国产一区二区三区不卡 | 国产精品日韩欧美一区二区三区 | 精品国产视频 | 操久久| 一级大黄色片 | 一区二区小视频 | 一级做a| 精品一区在线看 | 一级毛片在线播放 | 蜜桃一区二区三区 | 国产一区二区三区久久久久久久久 | 日本在线小视频 | 一区二区三区在线免费 | 久久亚洲精品视频 | 久久久999免费视频 999久久久久久久久6666 | 国产精品久久久久久久久久 | 国产精彩视频在线观看 | 亚洲成av | 亚洲逼院 | 福利网址 | 久久高潮 | av网站在线免费观看 | 日韩欧美国产精品一区 | 欧美激情视频一区二区三区在线播放 | 国产精品一区二区三区四区五区 | 国产一区二区三区在线 | 久久国产精品-久久精品 | 国产一区二区三区四区五区加勒比 | 久久亚洲高清 | 亚洲视频欧美视频 | 色狠狠一区| 爱爱视频日本 | 在线观看免费观看在线91 | 亚洲网址在线观看 | 亚洲黄色av |