<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](compound_stmts.xhtml "8. 復合語句") | - [上一頁](expressions.xhtml "6. 表達式") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | # 7. 簡單語句 簡單語句由一個單獨的邏輯行構成。 多條簡單語句可以存在于同一行內并以分號分隔。 簡單語句的句法為: ``` simple_stmt ::= expression_stmt | assert_stmt | assignment_stmt | augmented_assignment_stmt | annotated_assignment_stmt | pass_stmt | del_stmt | return_stmt | yield_stmt | raise_stmt | break_stmt | continue_stmt | import_stmt | future_stmt | global_stmt | nonlocal_stmt ``` ## 7.1. 表達式語句 表達式語句用于計算和寫入值(大多是在交互模式下),或者(通常情況)調用一個過程 (過程就是不返回有意義結果的函數;在 Python 中,過程的返回值為 `None`)。 表達式語句的其他使用方式也是允許且有特定用處的。 表達式語句的句法為: ``` expression_stmt ::= starred_expression ``` 表達式語句會對指定的表達式列表(也可能為單一表達式)進行求值。 在交互模式下,如果結果值不為 `None`,它會通過內置的 [`repr()`](../library/functions.xhtml#repr "repr") 函數轉換為一個字符串,該結果字符串將以單獨一行的形式寫入標準輸出(例外情況是如果結果為 `None`,則該過程調用不產生任何輸出。) ## 7.2. 賦值語句 賦值語句用于將名稱(重)綁定到特定值,以及修改屬性或可變對象的成員項: ``` assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression) target_list ::= target ("," target)* [","] target ::= identifier | "(" [target_list] ")" | "[" [target_list] "]" | attributeref | subscription | slicing | "*" target ``` (請參閱 [原型](expressions.xhtml#primaries) 一節了解 *屬性引用*, *抽取* 和 *切片* 的句法定義。) 賦值語句會對指定的表達式列表進行求值(注意這可能為單一表達式或是由逗號分隔的列表,后者將產生一個元組)并將單一結果對象從左至右逐個賦值給目標列表。 賦值是根據目標(列表)的格式遞歸地定義的。 當目標為一個可變對象(屬性引用、抽取或切片)的組成部分時,該可變對象必須最終執行賦值并決定其有效性,如果賦值操作不可接受也可能引發異常。 各種類型可用的規則和引發的異常通過對象類型的定義給出(參見 [標準類型層級結構](datamodel.xhtml#types) 一節)。 對象賦值的目標對象可以包含于圓括號或方括號內,具體操作按以下方式遞歸地定義。 - 如果目標列表為后面不帶逗號、可以包含于圓括號內的單一目標,則將對象賦值給該目標。 - 否則:該對象必須為具有與目標列表相同項數的可迭代對象,這些項將按從左至右的順序被賦值給對應的目標。 - 如果目標列表包含一個帶有星號前綴的目標,這稱為“加星”目標:則該對象至少必須為與目標列表項數減一相同項數的可迭代對象。 該可迭代對象前面的項將按從左至右的順序被賦值給加星目標之前的目標。 該可迭代對象末尾的項將被賦值給加星目標之后的目標。 然后該可迭代對象中剩余項的列表將被賦值給加星目標(該列表可以為空)。 - 否則:該對象必須為具有與目標列表相同項數的可迭代對象,這些項將按從左至右的順序被賦值給對應的目標。 對象賦值給單個目標的操作按以下方式遞歸地定義。 - 如果目標為標識符(名稱): - 如果該名稱未出現于當前代碼塊的 [`global`](#global) 或 [`nonlocal`](#nonlocal) 語句中:該名稱將被綁定到當前局部命名空間的對象。 - 否則:該名稱將被分別綁定到全局命名空間或由 [`nonlocal`](#nonlocal) 所確定的外層命名空間的對象。 如果該名稱已經被綁定則將被重新綁定。 這可能導致之前被綁定到該名稱的對象的引用計數變為零,造成該對象進入釋放過程并調用其析構器(如果存在)。 - 如果該對象為屬性引用:引用中的原型表達式會被求值。 它應該產生一個具有可賦值屬性的對象;否則將引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError")。 該對象會被要求將可賦值對象賦值給指定的屬性;如果它無法執行賦值,則會引發異常 (通常應為 [`AttributeError`](../library/exceptions.xhtml#AttributeError "AttributeError") 但并不強制要求)。 注意:如果該對象為類實例并且屬性引用在賦值運算符的兩側都出現,則右側表達式 `a.x` 可以訪問實例屬性或(如果實例屬性不存在)類屬性。 左側目標 `a.x` 將總是設定為實例屬性,并在必要時創建該實例屬性。 因此,`a.x` 的兩次出現不一定指向相同的屬性:如果右側表達式指向一個類屬性,則左側表達式會創建一個新的實例屬性作為賦值的目標: ``` class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3 ``` 此描述不一定作用于描述器屬性,例如通過 [`property()`](../library/functions.xhtml#property "property") 創建的特征屬性。 - 如果目標為一個抽取項:引用中的原型表達式會被求值。 它應當產生一個可變序列對象(例如列表)或一個映射對象(例如字典)。 接下來,該抽取表達式會被求值。 如果原型為一個可變序列對象(例如列表),抽取應產生一個整數。 如其為負值,則再加上序列長度。 結果值必須為一個小于序列長度的非負整數,序列將把被賦值對象賦值給該整數指定索引號的項。 如果索引超出范圍,將會引發 [`IndexError`](../library/exceptions.xhtml#IndexError "IndexError") (給被抽取序列賦值不能向列表添加新項)。 如果原型為一個映射對象(例如字典),抽取必須具有與該映射的鍵類型相兼容的類型,然后映射中會創建一個將抽取映射到被賦值對象的鍵/值對。 這可以是替換一個現有鍵/值對并保持相同鍵值,也可以是插入一個新鍵/值對(如果具有相同值的鍵不存在)。 對于用戶定義對象,會調用 [`__setitem__()`](datamodel.xhtml#object.__setitem__ "object.__setitem__") 方法并附帶適當的參數。 - 如果目標為一個切片:性和痛苦的原型表達式會被求值。 它應當產生一個可變序列對象(例如列表)。 被賦值對象應當是一個相同類型的序列對象。 接下來,下界與上界表達式如果存在的話將被求值;默認值分別為零和序列長度。 上下邊界值應當為整數。 如果某一邊界為負值,則會加上序列長度。 求出的邊界會被裁剪至介于零和序列長度的開區間中。 最后,將要求序列對象以被賦值序列的項替換該切片。 切片的長度可能與被賦值序列的長度不同,這會在目標序列允許的情況下改變目標序列的長度。 **CPython implementation detail:** 在當前實現中,目標的句法被當作與表達式的句法相同,無效的句法會在代碼生成階段被拒絕,導致不太詳細的錯誤信息。 雖然賦值的定義意味著左手邊與右手邊的重疊是“同時”進行的(例如 `a, b = b, a` 會交換兩個變量的值),但在賦值給變量的多項集 *之內* 的重疊是從左至右進行的,這有時會令人混淆。 例如,以下程序將會打印出 `[0, 2]`: ``` x = [0, 1] i = 0 i, x[i] = 1, 2 # i is updated, then x[i] is updated print(x) ``` 參見 [**PEP 3132**](https://www.python.org/dev/peps/pep-3132) \[https://www.python.org/dev/peps/pep-3132\] - 擴展的可迭代對象拆包對 `*target` 特性的規范說明。 ### 7.2.1. 增強賦值語句 增強賦值語句就是在單個語句中將二元運算和賦值語句合為一體: ``` augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) augtarget ::= identifier | attributeref | subscription | slicing augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" | ">>=" | "<<=" | "&=" | "^=" | "|=" ``` (請參閱 [原型](expressions.xhtml#primaries) 一節了解最后三種符號的句法定義。) 增強賦值語句將對目標和表達式列表求值(與普通賦值語句不同的是,前者不能為可迭代對象拆包),對兩個操作數相應類型的賦值執行指定的二元運算,并將結果賦值給原始目標。 目標僅會被求值一次。 增強賦值語句例如 `x += 1` 可以改寫為 `x = x + 1` 獲得類似但并非完全等價的效果。 在增強賦值的版本中,`x` 僅會被求值一次。 而且,在可能的情況下,實際的運算是 *原地* 執行的,也就是說并不是創建一個新對象并將其賦值給目標,而是直接修改原對象。 不同于普通賦值,增強賦值會在對右手邊求值 *之前* 對左手邊求值。 例如,`a[i] += f(x)` 首先查找 `a[i]`,然后對 `f(x)` 求值并執行加法操作,最后將結果寫回到 `a[i]`。 除了在單個語句中賦值給元組和多個目標的例外情況,增強賦值語句的賦值操作處理方式與普通賦值相同。 類似地,除了可能存在 *原地* 操作行為的例外情況,增強賦值語句執行的二元運算也與普通二元運算相同。 對于屬性引用類目標,針對常規賦值的 [關于類和實例屬性的警告](#attr-target-note) 也同樣適用。 ### 7.2.2. 帶標注的賦值語句 [標注](../glossary.xhtml#term-variable-annotation) 賦值就是在單個語句中將變量或屬性標注和可選的賦值語句合為一體: ``` annotated_assignment_stmt ::= augtarget ":" expression ["=" expression] ``` 與普通 [賦值語句](#assignment) 的差別在于僅有單個目標且僅有單個右手邊的值才被允許。 對于將簡單名稱作為賦值目標的情況,如果是在類或模塊作用域中,標注會被求值并存入一個特殊的類或模塊屬性 `__annotations__` 中,這是一個將變量名稱(如為私有會被移除)映射到被求值標注的字典。 此屬性為可寫并且在類或模塊體開始執行時如果靜態地發現標注就會自動創建。 對于將表達式作為賦值目標的情況,如果是在類或模塊作用域中,標注會被求值,但不會保存。 如果一個名稱在函數作用域內被標注,則該名稱為該作用域的局部變量。 標注絕不會在函數作用域內被求值和保存。 如果存在右手邊,帶標注的賦值會在對標注求值之前(如果適用)執行實際的賦值。 如果用作表達式目標的右手邊不存在,則解釋器會對目標求值,但最后的 [`__setitem__()`](datamodel.xhtml#object.__setitem__ "object.__setitem__") 或 [`__setattr__()`](datamodel.xhtml#object.__setattr__ "object.__setattr__") 調用除外。 參見 [**PEP 526**](https://www.python.org/dev/peps/pep-0526) \[https://www.python.org/dev/peps/pep-0526\] - 變量標注的語法該提議增加了標注變量(也包括類變量和實例變量)類型的語法,而不再是通過注釋來進行表達。 [**PEP 484**](https://www.python.org/dev/peps/pep-0484) \[https://www.python.org/dev/peps/pep-0484\] - 類型提示該提議增加了 [`typing`](../library/typing.xhtml#module-typing "typing: Support for type hints (see PEP 484).") 模塊以便為類型標注提供標準句法,可被靜態分析工具和 IDE 所使用。 ## 7.3. `assert` 語句 assert 語句是在程序中插入調試性斷言的簡便方式: ``` assert_stmt ::= "assert" expression ["," expression] ``` 簡單形式 `assert expression` 等價于 ``` if __debug__: if not expression: raise AssertionError ``` 擴展形式 `assert expression1, expression2` 等價于 ``` if __debug__: if not expression1: raise AssertionError(expression2) ``` 以上等價形式假定 [`__debug__`](../library/constants.xhtml#__debug__ "__debug__") 和 [`AssertionError`](../library/exceptions.xhtml#AssertionError "AssertionError") 指向具有指定名稱的內置變量。 在當前實現中,內置變量 [`__debug__`](../library/constants.xhtml#__debug__ "__debug__") 在正常情況下為 `True`,在請求優化時為 `False` (對應命令行選項為 [`-O`](../using/cmdline.xhtml#cmdoption-o))。 如果在編譯時請求優化,當前代碼生成器不會為 assert 語句發出任何代碼。 請注意不必在錯誤信息中包含失敗表達式的源代碼;它會被作為棧追蹤的一部分被顯示。 賦值給 [`__debug__`](../library/constants.xhtml#__debug__ "__debug__") 是非法的。 該內置變量的值會在解釋器啟動時確定。 ## 7.4. `pass` 語句 ``` pass_stmt ::= "pass" ``` [`pass`](#pass) 是一個空操作 --- 當它被執行時,什么都不發生。 它適合當語法上需要一條語句但并不需要執行任何代碼時用來臨時占位,例如: ``` def f(arg): pass # a function that does nothing (yet) class C: pass # a class with no methods (yet) ``` ## 7.5. `del` 語句 ``` del_stmt ::= "del" target_list ``` 刪除是遞歸定義的,與賦值的定義方式非常類似。 此處不再詳細說明,只給出一些提示。 目標列表的刪除將從左至右遞歸地刪除每一個目標。 名稱的刪除將從局部或全局命名空間中移除該名稱的綁定,具體作用域的確定是看該名稱是否有在同一代碼塊的 [`global`](#global) 語句中出現。 如果該名稱未被綁定,將會引發 [`NameError`](../library/exceptions.xhtml#NameError "NameError")。 屬性引用、抽取和切片的刪除會被傳遞給相應的原型對象;刪除一個切片基本等價于賦值為一個右側類型的空切片(但即便這一點也是由切片對象決定的)。 在 3.2 版更改: 在之前版本中,如果一個名稱作為被嵌套代碼塊中的自由變量出現,則將其從局部命名空間中刪除是非法的。 ## 7.6. `return` 語句 ``` return_stmt ::= "return" [expression_list] ``` [`return`](#return) 在語法上只會出現于函數定義所嵌套的代碼,不會出現于類定義所嵌套的代碼。 如果提供了表達式列表,它將被求值,否則以 `None` 替代。 [`return`](#return) 會離開當前函數調用,并以表達式列表 (或 `None`) 作為返回值。 當 [`return`](#return) 將控制流傳出一個帶有 [`finally`](compound_stmts.xhtml#finally) 子句的 [`try`](compound_stmts.xhtml#try) 語句時,該 `finally` 子句會先被執行然后再真正離開該函數。 在一個生成器函數中,[`return`](#return) 語句表示生成器已完成并將導致 [`StopIteration`](../library/exceptions.xhtml#StopIteration "StopIteration") 被引發。 返回值(如果有的話)會被當作一個參數用來構建 [`StopIteration`](../library/exceptions.xhtml#StopIteration "StopIteration") 并成為 `StopIteration.value` 屬性。 在一個異步生成器函數中,一個空的 [`return`](#return) 語句表示異步生成器已完成并將導致 [`StopAsyncIteration`](../library/exceptions.xhtml#StopAsyncIteration "StopAsyncIteration") 被引發。 一個非空的 `return` 語句在異步生成器函數中會導致語法錯誤。 ## 7.7. `yield` 語句 ``` yield_stmt ::= yield_expression ``` [`yield`](#yield) 語句在語義上等同于 [yield 表達式](expressions.xhtml#yieldexpr)。 yield 語句可用來省略在使用等效的 yield 表達式語句時所必須的圓括號。 例如,以下 yield 語句 ``` yield <expr> yield from <expr> ``` 等同于以下 yield 表達式語句 ``` (yield <expr>) (yield from <expr>) ``` yield 表達式和語句僅在定義 [generator](../glossary.xhtml#term-generator) 函數時使用,并且僅被用于生成器函數的函數體內部。 在函數定義中使用 yield 就足以使得該定義創建的是生成器函數而非普通函數。 有關 [`yield`](#yield) 語義的完整細節請參看 [yield 表達式](expressions.xhtml#yieldexpr) 一節。 ## 7.8. `raise` 語句 ``` raise_stmt ::= "raise" [expression ["from" expression]] ``` 如果不帶表達式,[`raise`](#raise) 會重新引發當前作用域內最后一個激活的異常。 如果當前作用域內沒有激活的異常,將會引發 [`RuntimeError`](../library/exceptions.xhtml#RuntimeError "RuntimeError") 來提示錯誤。 否則的話,[`raise`](#raise) 會將第一個表達式求值為異常對象。 它必須為 [`BaseException`](../library/exceptions.xhtml#BaseException "BaseException") 的子類或實例。 如果它是一個類,當需要時會通過不帶參數地實例化該類來獲得異常的實例。 異常的 *類型* 為異常實例的類,*值* 為實例本身。 當異常被引發時通常會自動創建一個回溯對象并將其關聯到可寫的 `__traceback__` 屬性。 你可以創建一個異常并同時使用 `with_traceback()` 異常方法(該方法將返回同一異常實例,并將回溯對象設為其參數)設置自己的回溯,就像這樣: ``` raise Exception("foo occurred").with_traceback(tracebackobj) ``` `from` 子句用于異常串連:如果有該子句,則第二個 *表達式* 必須為另一個異常或實例,它將作為可寫的 `__cause__` 屬性被關聯到所引發的異常。 如果引發的異常未被處理,兩個異常都將被打印出來: ``` >>> try: ... print(1 / 0) ... except Exception as exc: ... raise RuntimeError("Something bad happened") from exc ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened ``` 如果一個異常在異常處理器或 [`finally`](compound_stmts.xhtml#finally) clause: 中被引發,類似的機制會隱式地發揮作用,之前的異常將被關聯到新異常的 `__context__` 屬性: ``` >>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened ``` 異常串連可通過在 `from` 子句中指定 [`None`](../library/constants.xhtml#None "None") 來顯式地加以抑制: ``` >>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") from None ... Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened ``` 有關異常的更多信息可在 [異常](executionmodel.xhtml#exceptions) 一節查看,有關處理異常的信息可在 [try 語句](compound_stmts.xhtml#try) 一節查看。 在 3.3 版更改: [`None`](../library/constants.xhtml#None "None") 現在允許被用作 `raise X from Y` 中的 `Y`。 3\.3 新版功能: 使用 `__suppress_context__` 屬性來抑制異常上下文的自動顯示。 ## 7.9. `break` 語句 ``` break_stmt ::= "break" ``` [`break`](#break) 在語法上只會出現于 [`for`](compound_stmts.xhtml#for) 或 [`while`](compound_stmts.xhtml#while) 循環所嵌套的代碼,但不會出現于該循環內部的函數或類定義所嵌套的代碼。 它會終結最近的外層循環,如果循環有可選的 `else` 子句,也會跳過該子句。 如果一個 [`for`](compound_stmts.xhtml#for) 循環被 [`break`](#break) 所終結,該循環的控制目標會保持其當前值。 當 [`break`](#break) 將控制流傳出一個帶有 [`finally`](compound_stmts.xhtml#finally) 子句的 [`try`](compound_stmts.xhtml#try) 語句時,該 `finally` 子句會先被執行然后再真正離開該循環。 ## 7.10. `continue` 語句 ``` continue_stmt ::= "continue" ``` [`continue`](#continue) 在語法上只會出現于 [`for`](compound_stmts.xhtml#for) 或 [`while`](compound_stmts.xhtml#while) 循環所嵌套的代碼,但不會出現于該循環內部的函數或類定義或者 [`finally`](compound_stmts.xhtml#finally) 子句所嵌套的代碼。 它會繼續執行最近的外層循環的下一個輪次。 當 [`continue`](#continue) 將控制流傳出一個帶有 [`finally`](compound_stmts.xhtml#finally) 子句的 [`try`](compound_stmts.xhtml#try) 語句時,該 `finally` 子句會先被執行然后再真正開始循環的下一個輪次。 ## 7.11. `import` 語句 ``` import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])* | "from" relative_module "import" identifier ["as" identifier] ("," identifier ["as" identifier])* | "from" relative_module "import" "(" identifier ["as" identifier] ("," identifier ["as" identifier])* [","] ")" | "from" module "import" "*" module ::= (identifier ".")* identifier relative_module ::= "."* module | "."+ ``` 基本的 import 語句(不帶 [`from`](#from) 子句)會分兩步執行: 1. 查找一個模塊,如果有必要還會加載并初始化模塊。 2. 在局部命名空間中為 [`import`](#import) 語句發生位置所處的作用域定義一個或多個名稱。 當語句包含多個子句(由逗號分隔)時這兩個步驟將對每個子句分別執行,如同這些子句被分成獨立的 import 語句一樣。 第一個步驟即查找和加載模塊的詳情 [導入系統](import.xhtml#importsystem) 一節中有更詳細的描述,其中也描述了可被導入的多種類型的包和模塊,以及可用于定制導入系統的所有鉤子對象。 請注意這一步如果失敗,則可能說明模塊無法找到,*或者* 是在初始化模塊,包括執行模塊代碼期間發生了錯誤。 如果成功獲取到請求的模塊,則可以通過以下三種方式一之在局部命名空間中使用它: - 如果模塊名稱之后帶有 `as`,則跟在 `as` 之后的名稱將直接綁定到所導入的模塊。 - 如果沒有指定其他名稱,且被導入的模塊為最高層級模塊,則模塊的名稱將被綁定到局部命名空間作為對所導入模塊的引用。 - 如果被導入的模塊 *不是* 最高層級模塊,則包含該模塊的最高層級包的名稱將被綁定到局部命名空間作為對該最高層級包的引用。 所導入的模塊必須使用其完整限定名稱來訪問而不能直接訪問。 [`from`](#from) 形式使用的過程略微繁復一些: 1. 查找 [`from`](#from) 子句中指定的模塊,如有必要還會加載并初始化模塊; 2. 對于 [`import`](#import) 子句中指定的每個標識符: 1. 檢查被導入模塊是否有該名稱的屬性 2. 如果沒有,嘗試導入具有該名稱的子模塊,然后再次檢查被導入模塊是否有該屬性 3. 如果未找到該屬性,則引發 [`ImportError`](../library/exceptions.xhtml#ImportError "ImportError")。 4. 否則的話,將對該值的引用存入局部命名空間,如果有 `as` 子句則使用其指定的名稱,否則使用該屬性的名稱 例如: ``` import foo # foo imported and bound locally import foo.bar.baz # foo.bar.baz imported, foo bound locally import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb from foo.bar import baz # foo.bar.baz imported and bound as baz from foo import attr # foo imported and foo.attr bound as attr ``` 如果標識符列表改為一個星號 (`'*'`),則在模塊中定義的全部公有名稱都將按 [`import`](#import) 語句所在的作用域被綁定到局部命名空間。 一個模塊所定義的 *公有名稱* 是由在模塊的命名空間中檢測一個名為 `__all__` 的變量來確定的;如果有定義,它必須是一個字符串列表,其中的項為該模塊所定義或導入的名稱。 在 `__all__` 中所給出的名稱都會被視為公有并且應當存在。 如果 `__all__` 沒有被定義,則公有名稱的集合將包含在模塊的命名空間中找到的所有不以下劃線字符 (`'_'`) 打頭的名稱。 `__all__` 應當包括整個公有 API。 它的目標是避免意外地導出不屬于 API 的一部分的項(例如在模塊內部被導入和使用的庫模塊)。 通配符形式的導入 --- `from module import *` --- 僅在模塊層級上被允許。 嘗試在類或函數定義中使用它將引發 [`SyntaxError`](../library/exceptions.xhtml#SyntaxError "SyntaxError")。 當指定要導入哪個模塊時,你不必指定模塊的絕對名稱。 當一個模塊或包被包含在另一個包之中時,可以在同一個最高層級包中進行相對導入,而不必提及包名稱。 通過在 [`from`](#from) 之后指定的模塊或包中使用前綴點號,你可以在不指定確切名稱的情況下指明在當前包層級結構中要上溯多少級。 一個前綴點號表示是執行導入的模塊所在的當前包,兩個點號表示上溯一個包層級。 三個點號表示上溯兩級,依此類推。 因此如果你執行 `from . import mod` 時所處位置為 `pkg` 包內的一個模塊,則最終你將導入 `pkg.mod`。 如果你執行 `from ..subpkg2 import mod` 時所處位置為 `pkg.subpkg1` 則你將導入 `pkg.subpkg2.mod`。 有關相對導入的規范說明包含在 [Package Relative Imports](import.xhtml#relativeimports) 一節中。 [`importlib.import_module()`](../library/importlib.xhtml#importlib.import_module "importlib.import_module") 被提供用來為動態地確定要導入模塊的應用提供支持。 ### 7.11.1. future 語句 *future 語句* 是一種針對編譯器的指令,指明某個特定模塊應當使用在特定的未來某個 Python 發行版中成為標準特性的語法或語義。 future 語句的目的是使得向在語言中引入了不兼容改變的 Python 未來版本的遷移更為容易。 它允許基于每個模塊在某種新特性成為標準之前的發行版中使用該特性。 ``` future_stmt ::= "from" "__future__" "import" feature ["as" identifier] ("," feature ["as" identifier])* | "from" "__future__" "import" "(" feature ["as" identifier] ("," feature ["as" identifier])* [","] ")" feature ::= identifier ``` future 語句必須在靠近模塊開頭的位置出現。 可以出現在 future 語句之前行只有: - 模塊的文檔字符串(如果存在), - 注釋, - 空行,以及 - 其他 future 語句。 在 Python 3.7 中唯一需要使用 future 語句的特性是 `標注`。 future 語句所啟用的所有歷史特性仍然為 Python 3 所認可。 其中包括 `absolute_import`, `division`, `generators`, `generator_stop`, `unicode_literals`, `print_function`, `nested_scopes` 和 `with_statement`。 它們都已成為冗余項,因為它們總是為已啟用狀態,保留它們只是為了向后兼容。 future 語句在編譯時會被識別并做特殊對待:對核心構造語義的改變常常是通過生成不同的代碼來實現。 新的特性甚至可能會引入新的不兼容語法(例如新的保留字),在這種情況下編譯器可能需要以不同的方式來解析模塊。 這樣的決定不能推遲到運行時方才作出。 對于任何給定的發布版本,編譯器要知道哪些特性名稱已被定義,如果某個 future 語句包含未知的特性則會引發編譯時錯誤。 直接運行時的語義與任何 import 語句相同:存在一個后文將詳細說明的標準模塊 [`__future__`](../library/__future__.xhtml#module-__future__ "__future__: Future statement definitions"),它會在執行 future 語句時以通常的方式被導入。 相應的運行時語義取決于 future 語句所啟用的指定特性。 請注意以下語句沒有任何特別之處: ``` import __future__ [as name] ``` 這并非 future 語句;它只是一條沒有特殊語義或語法限制的普通 import 語句。 在默認情況下,通過對Code compiled by calls to the 內置函數 [`exec()`](../library/functions.xhtml#exec "exec") 和 [`compile()`](../library/functions.xhtml#compile "compile") 的調用所編譯的代碼如果出現于一個包含有 future 語句的模塊 `M` 之中,就會使用 future 語句所關聯的語法和語義。 此行為可以通過 [`compile()`](../library/functions.xhtml#compile "compile") 的可選參數加以控制 --- 請參閱該函數的文檔以了解詳情。 在交互式解釋器提示符中鍵入的 future 語句將在解釋器會話此后的交互中有效。 如果一個解釋器的啟動使用了 [`-i`](../using/cmdline.xhtml#cmdoption-i) 選項啟動,并傳入了一個腳本名稱來執行,且該腳本包含 future 語句,它將在交互式會話開始執行腳本之后保持有效。 參見 [**PEP 236**](https://www.python.org/dev/peps/pep-0236) \[https://www.python.org/dev/peps/pep-0236\] - 回到 \_\_future\_\_有關 \_\_future\_\_ 機制的最初提議。 ## 7.12. `global` 語句 ``` global_stmt ::= "global" identifier ("," identifier)* ``` [`global`](#global) 語句是作用于整個當前代碼塊的聲明。 它意味著所列出的標識符將被解讀為全局變量。 要給全局變量賦值不可能不用到 `global` 關鍵字,不過自由變量也可以指向全局變量而不必聲明為全局變量。 在 [`global`](#global) 語句中列出的名稱不得在同一代碼塊內該 `global` 語句之前的位置中使用。 在 [`global`](#global) 語句中列出的名稱不得被定義為正式形參,不也得出現于 [`for`](compound_stmts.xhtml#for) 循環的控制目標、[`class`](compound_stmts.xhtml#class) 定義、函數定義、[`import`](#import) 語句或變量標注之中。 **CPython implementation detail:** 當前的實現并未強制要求所有的上述限制,但程序不應當濫用這樣的自由,因為未來的實現可能會改為強制要求,并靜默地改變程序的含義。 **程序員注意事項:** [`global`](#global) 是對解析器的指令。 它僅對與 `global` 語句同時被解析的代碼起作用。 特別地,包含在提供給內置 [`exec()`](../library/functions.xhtml#exec "exec") 函數字符串或代碼對象中的 `global` 語句并不會影響 *包含* 該函數調用的代碼塊,而包含在這種字符串中的代碼也不會受到包含該函數調用的代碼中的 `global` 語句影響。 這同樣適用于 [`eval()`](../library/functions.xhtml#eval "eval") 和 [`compile()`](../library/functions.xhtml#compile "compile") 函數。 ## 7.13. `nonlocal` 語句 ``` nonlocal_stmt ::= "nonlocal" identifier ("," identifier)* ``` [`nonlocal`](#nonlocal) 語句會使得所列出的名稱指向之前在最近的包含作用域中綁定的除全局變量以外的變量。 這種功能很重要,因為綁定的默認行為是先搜索局部命名空間。 這個語句允許被封裝的代碼重新綁定局部作用域以外且非全局(模塊)作用域當中的變量。 與 [`global`](#global) 語句中列出的名稱不同,[`nonlocal`](#nonlocal) 語句中列出的名稱必須指向之前存在于包含作用域之中的綁定(在這個應當用來創建新綁定的作用域不能被無歧義地確定)。 [`nonlocal`](#nonlocal) 語句中列出的名稱不得與之前存在于局部作用域中的綁定相沖突。 參見 [**PEP 3104**](https://www.python.org/dev/peps/pep-3104) \[https://www.python.org/dev/peps/pep-3104\] - 訪問外層作用域中的名稱有關 [`nonlocal`](#nonlocal) 語句的規范說明。 ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](compound_stmts.xhtml "8. 復合語句") | - [上一頁](expressions.xhtml "6. 表達式") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看