做(zuò)自(zì)由與創造的先行(xíng)者

Types: 11. Context Manager Types

Python開(kāi)發手冊

11. Context Manager Types

2.5版本中的新功能(néng)。

Python的with語句支持由上(shàng)下(xià)文管理器定義的運行(xíng)時(shí)上(shàng)下(xià)文的概念。這(zhè)是通(tōng)過使用兩個獨立的方法實現的,它們允許用戶定義的類定義在執行(xíng)語句正文前輸入的運行(xíng)時(shí)上(shàng)下(xià)文,并在語句結束時(shí)退出。

的上(shàng)下(xià)文管理協議(yì)由一(yī)對需要(yào)被提供用于上(shàng)下(xià)文管理器對象來定義一(yī)個運行(xíng)時(shí)環境的方法:

contextmanager.__enter__()

輸入運行(xíng)時(shí)上(shàng)下(xià)文并返回此對象或與運行(xíng)時(shí)上(shàng)下(xià)文相關的另一(yī)個對象。此方法返回的值綁定到使用此上(shàng)下(xià)文管理器as的with語句子句中的标識符。

一(yī)個返回自(zì)身的上(shàng)下(xià)文管理器的例子是一(yī)個文件對象。文件對象從(cóng)__enter __()返回,以允許open()在with語句中用作(zuò)上(shàng)下(xià)文表達式。

返回相關對象的上(shàng)下(xià)文管理器的示例是返回的對象decimal.localcontext()。這(zhè)些管理器将激活的小數(shù)上(shàng)下(xià)文設置為(wèi)原始小數(shù)上(shàng)下(xià)文的副本,然後返回副本。這(zhè)允許對with語句正文中的當前小數(shù)上(shàng)下(xià)文進行(xíng)更改,而不影響with語句外(wài)的代碼。

contextmanager.__exit__(exc_type, exc_val, exc_tb)

退出運行(xíng)時(shí)環境并返回一(yī)個布爾标志,指示是否應該抑制發生的任何異常。如(rú)果執行(xíng)with語句正文時(shí)發生異常,則參數(shù)将包含異常類型,值和(hé)追溯信息。否則,所有三個參數(shù)都(dōu)是None。

從(cóng)此方法返回一(yī)個真值将導緻with語句禁止該異常,并繼續執行(xíng)語句之後的with語句。否則在該方法執行(xíng)完成後異常繼續傳播。在執行(xíng)此方法期間(jiān)發生的異常将替換發生在with語句正文中的任何異常。

傳入的異常不應該顯式重新顯示 - 相反,此方法應該返回一(yī)個false值,以指示該方法已成功完成,并且不希望抑制引發的異常。這(zhè)允許上(shàng)下(xià)文管理代碼(例如(rú)contextlib.nested)容易地(dì)檢測__exit__()方法是否實際上(shàng)已經失敗。

Python定義了(le)幾個上(shàng)下(xià)文管理器來支持簡單的線程同步,及時(shí)關閉文件或其他(tā)對象,并簡化對活動的十進制算術(shù)上(shàng)下(xià)文的操作(zuò)。特定的類型沒有特别對待它們的上(shàng)下(xià)文管理協議(yì)的實現。有關contextlib示例,請(qǐng)參閱模塊。

Python的生成器和(hé)contextlib.contextmanager 裝飾器提供了(le)實現這(zhè)些協議(yì)的便捷方式。如(rú)果一(yī)個生成器函數(shù)用contextlib.contextmanager裝飾器修飾,它将返回一(yī)個實現必要(yào)__enter__()和(hé)__exit__()方法的上(shàng)下(xià)文管理器,而不是由未修飾的生成器函數(shù)生成的叠代器。

請(qǐng)注意,Python / C API中的Python對象的類型結構中沒有任何這(zhè)些方法的特定插槽。想要(yào)定義這(zhè)些方法的擴展類型必須提供它們作(zuò)為(wèi)普通(tōng)的Python可(kě)訪問(wèn)方法。與設置運行(xíng)時(shí)環境的開(kāi)銷相比,單個類字典查找的開(kāi)銷可(kě)以忽略不計。

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:Types: 12. Other Built-in Types
上(shàng)一(yī)篇:Types: 10. memoryview type