在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 執(zhí)行模型
復(fù)合語句
數(shù)據(jù)模型
完整的語法規(guī)范
執(zhí)行模型
表達式
導(dǎo)入系統(tǒng)
詞法分析
簡單語句
頂層組件
介紹

執(zhí)行模型

命名空間和代碼塊

名字 Names 參考對象,名字綁定操作介紹了名字,程序代碼中每一個名字的產(chǎn)生都參考從建立在包含使用的最里面功能塊名字 bingding

一個代碼塊是一個可以作為一個單元執(zhí)行的Python程序文本,像模塊,類定義或函數(shù)體。每個命令類型的交互是一塊。一個腳本文件(一個文件作為標(biāo)準(zhǔn)輸入翻譯或作為一個命令行參數(shù)指定的翻譯)是個代碼塊,一個腳本命令(可選 ‘ -c ’ 在命令解釋行指定)是個代碼塊。傳遞給內(nèi)建函數(shù) eval()exec() 的字符串參數(shù)是個代碼塊。

代碼塊在運行結(jié)構(gòu)框架內(nèi)執(zhí)行,一個框架包含一些管理信息(用來調(diào)試),決定執(zhí)行完代碼塊后在哪繼續(xù)執(zhí)行和怎么執(zhí)行。

一個范圍定義代碼塊內(nèi)名字的可視性,如果在一個快中定義了局部變量,它的范圍就包含那個代碼塊,如果定義出現(xiàn)在一個函數(shù)塊里,那么范圍就擴展到任何一個包含這個定義的代碼塊,除非代碼塊引進一個不同的綁定名字。類代碼塊中定義名字范圍僅限于類代碼塊;它不能擴展到方法代碼塊——包括理解式和生成表達式,因為它們使用一個函數(shù)實現(xiàn)范圍。這意味著下面執(zhí)行將會失?。?/p>

class A:

    a = 42
    b = list(a + i for i in range(10))

在代碼塊中使用名字時,使用最近封閉范圍解決。所有這樣的設(shè)置可視范圍代碼塊的集合叫做塊的環(huán)境。

如果一個名字綁定在代碼塊內(nèi),除非聲明為 nonlocal,它的局部變量都是屬于那個塊的。如果一個名字綁定在模塊級別,它是一個全局變量。(模塊代碼塊變量是局部和全局。)如果一個變量沒有定義卻在模塊中使用,那么它是自由變量

當(dāng)根本沒發(fā)現(xiàn)一個名字時,拋出異常 NameError 。如果名字指向一個沒有綁定的局部變量,拋出異常 UnboundLocalErrorUnboundLocalErrorNameError 的子類。

結(jié)構(gòu)綁定名字:正規(guī)參數(shù)函數(shù),import 語句,類和函數(shù)定義(在代碼塊中定義的類或函數(shù)名字綁定),如果在分配中發(fā)生,目標(biāo)就是標(biāo)示符,for 循環(huán)首部,或者在 with 語句中 as 之后,或 except 子句。import 的形式語句 from ... import ...* 綁定所有導(dǎo)入模塊中定義的名字,除非那些以下劃線開始的。這種形式語句可能僅使用在模塊級別。

目標(biāo)發(fā)生在 del 語句中也考慮綁定這個目的(盡管真實的情況是不綁定名字)。

每次分配或?qū)胝Z句發(fā)生在代碼塊內(nèi),它通過類或者函數(shù)定義或者在模塊級別定義(頂端是代碼塊)。

如果一個名稱綁定操作發(fā)生在一個代碼塊內(nèi),塊內(nèi)的所有使用的名稱被視為對當(dāng)前塊的引用。這可能導(dǎo)致在一個塊之前錯誤使用一個名字,這條規(guī)則是微妙的,Python 中在一個代碼塊內(nèi)缺乏聲明和允許名稱進行綁定的操作。一個代碼塊的局部變量可以由掃描整個文本塊的名稱綁定操作。

如果 global 聲明發(fā)生在一個代碼塊內(nèi),所有在聲明中指定使用的名字是指綁定頂級名稱空間的名字。頂級命名空間中的名字解析通過搜索全局命名空間,即模塊的命名空間包含代碼塊,內(nèi)建命名空間,內(nèi)建模塊 builtins 命名空間。先搜索全局命名空間,如果沒有找到名字,繼續(xù)搜索內(nèi)建命名空間。global 聲明必須優(yōu)先于所有名字的聲明。

內(nèi)建命令名稱空間相關(guān)聯(lián)的一個代碼塊的執(zhí)行實際上是發(fā)現(xiàn)通過它的全局名稱空間查找名字 __builtins__ ,這應(yīng)該是一個字典或一個模塊(在后一種情況下所使用的模塊的詞典)。默認(rèn)情況下,當(dāng)在 __main__ 模塊中時, __builtins__ 是內(nèi)建模塊 builtins,當(dāng)在其他模塊中時, __builtins__ 是詞典內(nèi)鍵模塊的別名。__builtins__ 可以設(shè)置為用戶創(chuàng)建字典,是創(chuàng)建一個限制執(zhí)行的弱形式。

CPython 實現(xiàn)細(xì)節(jié):用戶不會接觸到 __builtins__,它是個嚴(yán)格的細(xì)節(jié)實現(xiàn)。用戶想要覆蓋內(nèi)建命名空間的值就應(yīng)該 import 內(nèi)建模塊 builtins 并適當(dāng)?shù)匦薷乃膶傩浴?/p>

一個模塊的命名空間在第一次自動創(chuàng)建時總是被導(dǎo)入的。一個腳本的主模塊總是叫 __main__ 。

在一個相同的代碼塊內(nèi),global 聲明和名字綁定操作具有相同的范圍,如果最近的封閉范圍內(nèi)自由變量包含一個全局聲明,自由變量就會當(dāng)做全局變量。

動態(tài)交互功能

Python 語句中有幾種情況是在非法使用時結(jié)合最近的包含自由變量的范圍。

如果在一個封閉范圍中引用一個變量,刪除這個名字是非法的。在編譯時將產(chǎn)生一個錯誤報告。

如果函數(shù)和函數(shù)包含中使用導(dǎo)入 improt* 通配符形式,或者是最近的一個自由變量塊,編譯器將拋出異常 SyntaxError 。

函數(shù) eval()exec() 不能訪問解釋名字的全局變量。名字可能是解決局部和全局命名空間的調(diào)用者。自由變量不能解決最近的封閉命名空間,但在全局命名空間中可以。[1] eval()exec() 函數(shù)可選參數(shù)覆蓋全局和局部命名空間。如果只指定一個命名空間,兩個函數(shù)都可以使用。

異常

異常就是為了處理出錯或者處理其它意外情況而中斷代碼塊的正??刂屏?。異常在錯誤被檢測到的位置被拋出,它可以被其周圍相關(guān)代碼的處理,或者錯誤發(fā)生處直接或間接調(diào)用的代碼塊處理。

Python 解釋器在它檢測到一個運行時錯誤時拋出一個異常(比如除以零)。某個Python 程序也可以通過 raise 語句顯式地拋出異常。異常處理器可以用 try ... except 語句指定。try ... finally 語句指定清理代碼塊,但是它不處理異常,只是無論先前代碼中是否產(chǎn)生異常都會得到執(zhí)行。

Python使用所謂的“中斷”錯誤處理模型:一個異常處理器能在外層找出錯誤發(fā)生和繼續(xù)執(zhí)行的位置。但是它不能修復(fù)錯誤和重試錯誤的操作(除非重新從頭進入該段出錯的代碼)。

當(dāng)一個異常沒有得到控制,解釋器就中斷程序的執(zhí)行,或返回到它的主循環(huán)的迭代中。其它情況下,除了不是 SystemExit 異常,它還打印一個堆棧跟蹤回溯對象。

異常由一個字符串對象或一個類實例標(biāo)識,所匹配的 except 子句的選擇是基于對象標(biāo)識的:except子句必須引用相同的類或其基類,可以接受處理程序,也可以攜帶更多關(guān)于異常條件的信息。

注意:異常消息不是 Python 標(biāo)準(zhǔn)處理借口 API 的一部分,它的內(nèi)容可能會伴隨 Python 版本升級改變,而不帶有任何告警,不應(yīng)依賴于在多個版本的編譯器下運行代碼。

The try statement 章節(jié)見 try 的描述,以及 The raise statement 章節(jié)見 raise 的描述。

上一篇:表達式下一篇:簡單語句