做自(zì)由與創造的先行者

Types: 11. Context Manager Types

Python開(kāi)發手冊

11. Context Manager Types

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

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

的上(shàng)下(xià)文(wén)管理(lǐ)協議(yì)由一對(duì)需要被提供用(yòng)于上(shàng)下(xià)文(wén)管理(lǐ)器對(duì)象來(lái)定義一個運行時(shí)環境的方法:

contextmanager.__enter__()

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

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

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

contextmanager.__exit__(exc_type, exc_val, exc_tb)

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

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

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

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

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

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

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