7。 簡単なステートメント
単純なステートメントは、単一の論理行で構成されます。 セミコロンで区切られた1行に、いくつかの簡単なステートメントが表示される場合があります。 単純なステートメントの構文は次のとおりです。
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()関数を使用して文字列に変換され、結果の文字列は次の行で標準出力に書き込まれます。それ自体(結果がNone
の場合を除き、プロシージャ呼び出しによって出力が発生することはありません。)
7.2。 割り当てステートメント
割り当てステートメントは、名前を値に(再)バインドし、可変オブジェクトの属性またはアイテムを変更するために使用されます。
Assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression) target_list ::= target ("," target)* [","] ターゲット ::= identifier | "(" [target_list] ")" | "[" [target_list] "]" | attributeref | subscription | slicing | "*" target
( attributeref 、 Subscription 、および Slicing の構文定義については、セクション Primarys を参照してください。)
代入ステートメントは、式リストを評価し(これは単一の式またはコンマ区切りのリストであり、後者はタプルを生成することに注意してください)、結果の単一のオブジェクトを各ターゲットリストに左から右に割り当てます。
割り当ては、ターゲット(リスト)の形式に応じて再帰的に定義されます。 ターゲットが可変オブジェクト(属性参照、サブスクリプション、またはスライス)の一部である場合、可変オブジェクトは最終的に割り当てを実行してその有効性を決定する必要があり、割り当てが受け入れられない場合は例外が発生する可能性があります。 さまざまな型によって守られる規則と発生する例外は、オブジェクト型の定義とともに示されます(セクション標準型階層を参照)。
ターゲットリストへのオブジェクトの割り当ては、オプションで括弧または角括弧で囲まれ、次のように再帰的に定義されます。
- ターゲットリストが、オプションで括弧内に末尾のコンマがない単一のターゲットである場合、オブジェクトはそのターゲットに割り当てられます。
- それ以外の場合:オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムで反復可能である必要があり、アイテムは左から右に、対応するターゲットに割り当てられます。
- ターゲットリストに、「スター付き」ターゲットと呼ばれる、アスタリスクが前に付いた1つのターゲットが含まれている場合:オブジェクトは、少なくともターゲットリスト内のターゲットと同じ数から1を引いた数のアイテムで反復可能である必要があります。 反復可能オブジェクトの最初の項目は、スター付きターゲットの前のターゲットに左から右に割り当てられます。 iterableの最後のアイテムは、スター付きターゲットの後にターゲットに割り当てられます。 次に、イテラブル内の残りのアイテムのリストがスター付きターゲットに割り当てられます(リストは空にすることができます)。
- それ以外の場合:オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムで反復可能である必要があり、アイテムは左から右に、対応するターゲットに割り当てられます。
単一のターゲットへのオブジェクトの割り当ては、次のように再帰的に定義されます。
ターゲットが識別子(名前)の場合:
現在のコードブロックの global または nonlocal ステートメントに名前がない場合:名前は現在のローカル名前空間のオブジェクトにバインドされます。
それ以外の場合:名前は、それぞれ nonlocal によって決定されるグローバル名前空間または外部名前空間のオブジェクトにバインドされます。
すでにバインドされている場合、名前はリバウンドされます。 これにより、以前に名前にバインドされていたオブジェクトの参照カウントがゼロになり、オブジェクトの割り当てが解除され、そのデストラクタ(存在する場合)が呼び出される可能性があります。
ターゲットが属性参照の場合:参照内の一次式が評価されます。 割り当て可能な属性を持つオブジェクトを生成する必要があります。 そうでない場合は、 TypeError が発生します。 次に、そのオブジェクトは、割り当てられたオブジェクトを指定された属性に割り当てるように求められます。 割り当てを実行できない場合は、例外が発生します(通常、必ずしもそうとは限りませんが、 AttributeError )。
注:オブジェクトがクラスインスタンスであり、属性参照が割り当て演算子の両側で発生する場合、右辺の式
a.x
は、インスタンス属性または(インスタンス属性が存在しない場合)のいずれかにアクセスできます。クラス属性。 左側のターゲットa.x
は常にインスタンス属性として設定され、必要に応じて作成されます。 したがって、a.x
の2つのオカレンスは、必ずしも同じ属性を参照するわけではありません。右側の式がクラス属性を参照する場合、左側は割り当てのターゲットとして新しいインスタンス属性を作成します。 :class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3
この説明は、 property()で作成されたプロパティなどの記述子属性には必ずしも適用されません。
ターゲットがサブスクリプションの場合:参照のプライマリ式が評価されます。 可変シーケンスオブジェクト(リストなど)またはマッピングオブジェクト(辞書など)のいずれかを生成する必要があります。 次に、添え字式が評価されます。
プライマリが可変シーケンスオブジェクト(リストなど)である場合、添え字は整数を生成する必要があります。 負の場合、シーケンスの長さがそれに追加されます。 結果の値は、シーケンスの長さよりも短い非負の整数である必要があり、シーケンスは、割り当てられたオブジェクトをそのインデックスを持つアイテムに割り当てるように求められます。 インデックスが範囲外の場合、 IndexError が発生します(添え字付きシーケンスへの割り当てでは、リストに新しいアイテムを追加できません)。
プライマリがマッピングオブジェクト(ディクショナリなど)である場合、添え字はマッピングのキータイプと互換性のあるタイプである必要があり、マッピングは、割り当てられたオブジェクトに添え字をマッピングするキー/データムペアを作成するように求められます。 これにより、既存のキーと値のペアを同じキー値に置き換えるか、新しいキーと値のペアを挿入できます(同じ値のキーが存在しない場合)。
ユーザー定義オブジェクトの場合、
__setitem__()
メソッドが適切な引数で呼び出されます。ターゲットがスライスの場合:参照のプライマリ式が評価されます。 可変シーケンスオブジェクト(リストなど)を生成する必要があります。 割り当てられるオブジェクトは、同じタイプのシーケンスオブジェクトである必要があります。 次に、下限式と上限式が存在する限り、それらが評価されます。 デフォルトはゼロで、シーケンスの長さです。 境界は整数に評価される必要があります。 いずれかの境界が負の場合、シーケンスの長さがそれに追加されます。 結果の境界は、ゼロとシーケンスの長さの間に収まるようにクリップされます。 最後に、シーケンスオブジェクトは、スライスを割り当てられたシーケンスのアイテムに置き換えるように求められます。 スライスの長さは、割り当てられたシーケンスの長さと異なる場合があります。したがって、ターゲットシーケンスで許可されている場合は、ターゲットシーケンスの長さが変更されます。
割り当ての定義は、左側と右側の間のオーバーラップが「同時」であることを意味しますが(たとえば、a, b = b, a
は2つの変数を交換します)、はの割り当てられたコレクション内でオーバーラップします-to変数は左から右に発生し、混乱を招くことがあります。 たとえば、次のプログラムは[0, 2]
を出力します。
x = [0, 1]
i = 0
i, x[i] = 1, 2 # i is updated, then x[i] is updated
print(x)
7.2.1。 拡張された割り当てステートメント
拡張代入は、1つのステートメントで、二項演算と代入ステートメントを組み合わせたものです。
augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) augtarget ::= identifier | attributeref | subscription | slicing augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" | ">>=" | "<<=" | "&=" | "^=" | "|="
(最後の3つのシンボルの構文定義については、セクション Primarys を参照してください。)
拡張代入は、ターゲット(通常の代入ステートメントとは異なり、アンパックすることはできません)と式リストを評価し、2つのオペランドで代入のタイプに固有の二項演算を実行し、結果を元のターゲットに割り当てます。 ターゲットは1回だけ評価されます。
x += 1
のような拡張代入式は、x = x + 1
として書き直すことができます。これにより、同様の効果が得られますが、完全に同じではありません。 拡張バージョンでは、x
は1回だけ評価されます。 また、可能な場合、実際の操作はインプレースで実行されます。つまり、新しいオブジェクトを作成してターゲットに割り当てるのではなく、古いオブジェクトが変更されます。
通常の割り当てとは異なり、拡張割り当ては左側を評価し、右側を評価します。 たとえば、a[i] += f(x)
は最初にa[i]
を検索し、次にf(x)
を評価して加算を実行し、最後に結果をa[i]
に書き戻します。
1つのステートメントでタプルと複数のターゲットに割り当てることを除いて、拡張された割り当てステートメントによって行われる割り当ては、通常の割り当てと同じ方法で処理されます。 同様に、可能なインプレース動作を除いて、拡張代入によって実行される2項演算は、通常の2項演算と同じです。
属性参照であるターゲットの場合、クラスおよびインスタンス属性に関する同じ警告が通常の割り当ての場合と同じように適用されます。
7.2.2。 注釈付きの割り当てステートメント
アノテーション割り当ては、単一のステートメントで、変数または属性のアノテーションとオプションの割り当てステートメントを組み合わせたものです。
annotated_assignment_stmt ::= augtarget ":" expression ["=" (starred_expression | yield_expression)]
通常の割り当てステートメントとの違いは、単一のターゲットのみが許可されることです。
割り当てターゲットとしての単純な名前の場合、クラスまたはモジュールスコープ内の場合、アノテーションは評価され、変数名(プライベートの場合はマングル)から評価されたアノテーションへのディクショナリマッピングである特別なクラスまたはモジュール属性__annotations__
に格納されます。 この属性は書き込み可能であり、アノテーションが静的に見つかった場合、クラスまたはモジュール本体の実行の開始時に自動的に作成されます。
割り当てターゲットとしての式の場合、注釈はクラスまたはモジュールスコープ内にあるかどうかが評価されますが、保存されません。
関数スコープで名前に注釈が付けられている場合、この名前はそのスコープに対してローカルです。 アノテーションが評価され、関数スコープに格納されることはありません。
右側が存在する場合、注釈付きの割り当ては、注釈を評価する前に実際の割り当てを実行します(該当する場合)。 式ターゲットの右側が存在しない場合、インタプリタは最後の__setitem__()
または__setattr__()
呼び出しを除いてターゲットを評価します。
も参照してください
- PEP 526 -変数注釈の構文
- コメントで表現するのではなく、変数のタイプ(クラス変数とインスタンス変数を含む)に注釈を付けるための構文を追加した提案。
- PEP 484 -タイプのヒント
- 静的分析ツールおよびIDEで使用できる型注釈の標準構文を提供するために typing モジュールを追加した提案。
バージョン3.8で変更:注釈付きの割り当てでは、通常の割り当てと同じ式を右側で使用できるようになりました。 以前は、一部の式(括弧で囲まれていないタプル式など)によって構文エラーが発生していました。
7.3。 NSassert 声明
アサーションステートメントは、デバッグアサーションをプログラムに挿入するための便利な方法です。
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 __ および AssertionError がそれらの名前の組み込み変数を参照していることを前提としています。 現在の実装では、組み込み変数 __ debug __ は通常の状況ではTrue
であり、最適化が要求された場合はFalse
です(コマンドラインオプション -O )。 現在のコードジェネレーターは、コンパイル時に最適化が要求されたときに、assertステートメントのコードを出力しません。 エラーメッセージで失敗した式のソースコードを含める必要がないことに注意してください。 スタックトレースの一部として表示されます。
__ debug __ への割り当ては不正です。 組み込み変数の値は、インタープリターの起動時に決定されます。
7.4。 NSpass 声明
pass_stmt ::= "pass"
pass はnull操作です—実行されても、何も起こりません。 ステートメントが構文的に必要であるが、コードを実行する必要がない場合のプレースホルダーとして役立ちます。次に例を示します。
def f(arg): pass # a function that does nothing (yet)
class C: pass # a class with no methods (yet)
7.5。 NSdel 声明
del_stmt ::= "del" target_list
削除は、割り当ての定義方法と非常によく似た再帰的定義です。 完全に詳しく説明するのではなく、ここにいくつかのヒントがあります。
ターゲットリストを削除すると、各ターゲットが左から右に再帰的に削除されます。
名前を削除すると、その名前が同じコードブロックの global ステートメントにあるかどうかに応じて、ローカル名前空間またはグローバル名前空間からその名前のバインドが削除されます。 名前がバインドされていない場合、 NameError 例外が発生します。
属性参照、サブスクリプション、およびスライスの削除は、関連するプライマリオブジェクトに渡されます。 スライスの削除は、一般に、適切なタイプの空のスライスの割り当てと同等です(ただし、これでもスライスされたオブジェクトによって決定されます)。
バージョン3.2で変更:以前は、ネストされたブロックで自由変数として発生した場合、ローカル名前空間から名前を削除することは違法でした。
7.6。 NSreturn 声明
return_stmt ::= "return" [expression_list]
return は、ネストされたクラス定義内ではなく、関数定義内で構文的にネストされた場合にのみ発生する可能性があります。
式リストが存在する場合は評価され、存在しない場合はNone
に置き換えられます。
return は、現在の関数呼び出しを式リスト(またはNone
)として残します。
return が try ステートメントから finally 句を使用して制御を渡すと、そのfinally
句が実際に関数を終了する前に実行されます。
ジェネレーター関数では、 return ステートメントは、ジェネレーターが完了し、 StopIteration が発生することを示します。 戻り値(存在する場合)は、 StopIteration を構築するための引数として使用され、StopIteration.value
属性になります。
非同期ジェネレーター関数では、空の return ステートメントは、非同期ジェネレーターが完了し、 StopAsyncIteration が発生することを示します。 空でないreturn
ステートメントは、非同期ジェネレーター関数の構文エラーです。
7.7。 NSyield 声明
yield_stmt ::= yield_expression
yield ステートメントは、 yield式と意味的に同等です。 同等のyield式ステートメントで必要となる括弧を省略して、yieldステートメントを使用できます。 たとえば、yieldステートメント
yield <expr>
yield from <expr>
はyield式ステートメントと同等です
(yield <expr>)
(yield from <expr>)
降伏式とステートメントは、ジェネレーター関数を定義するときにのみ使用され、ジェネレーター関数の本体でのみ使用されます。 関数定義でyieldを使用するだけで、その定義で通常の関数ではなくジェネレーター関数を作成できます。
利回りセマンティクスの詳細については、利回り式セクションを参照してください。
7.8。 NSraise 声明
raise_stmt ::= "raise" [expression ["from" expression]]
式が存在しない場合、 raise は、現在のスコープでアクティブだった最後の例外を再発生させます。 現在のスコープでアクティブな例外がない場合、 RuntimeError 例外が発生し、これがエラーであることを示します。
それ以外の場合、 raise は最初の式を例外オブジェクトとして評価します。 BaseException のサブクラスまたはインスタンスのいずれかである必要があります。 クラスの場合、引数なしでクラスをインスタンス化することにより、必要に応じて例外インスタンスが取得されます。
例外の type は例外インスタンスのクラスであり、 value はインスタンス自体です。
トレースバックオブジェクトは通常、例外が発生したときに自動的に作成され、書き込み可能な__traceback__
属性としてオブジェクトにアタッチされます。 次のように、with_traceback()
例外メソッド(トレースバックが引数に設定された同じ例外インスタンスを返す)を使用して、例外を作成し、独自のトレースバックを1つのステップで設定できます。
raise Exception("foo occurred").with_traceback(tracebackobj)
from
句は例外チェーンに使用されます。指定されている場合、2番目の式は別の例外クラスまたはインスタンスである必要があります。 2番目の式が例外インスタンスの場合、発生した例外に__cause__
属性(書き込み可能)としてアタッチされます。 式が例外クラスの場合、クラスがインスタンス化され、結果の例外インスタンスが__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 句内で例外が発生した場合、同様のメカニズムが暗黙的に機能します。前の例外は、新しい例外の__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 を指定することにより、例外の連鎖を明示的に抑制することができます。
>>> 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
例外に関する追加情報はセクション例外にあり、例外の処理に関する情報はセクション tryステートメントにあります。
バージョン3.3で変更: なしがraise X from Y
のY
として許可されるようになりました。
バージョン3.3の新機能: __suppress_context__
属性は、例外コンテキストの自動表示を抑制します。
7.9。 NSbreak 声明
break_stmt ::= "break"
break は、 for または while ループに構文的にネストされている場合にのみ発生しますが、そのループ内の関数またはクラス定義にはネストされていません。
オプションのelse
句がある場合はスキップして、最も近い囲んでいるループを終了します。
for ループが break で終了した場合、ループ制御ターゲットは現在の値を保持します。
break が finally 句を含む try ステートメントから制御を渡すと、そのfinally
句が実際にループを離れる前に実行されます。
7.10。 NScontinue 声明
continue_stmt ::= "continue"
Continue は、 for または while ループに構文的にネストされている場合にのみ発生しますが、そのループ内の関数またはクラス定義にはネストされていません。 これは、最も近い囲みループの次のサイクルに続きます。
continue が try ステートメントから finally 句を使用して制御を渡すと、そのfinally
句が実行されてから次のループサイクルが実際に開始されます。
7.11。 NSimport 声明
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" "*" モジュール ::= (identifier ".")* identifier related_module ::= "."* module | "."+
基本的なインポートステートメント( from 句なし)は、次の2つのステップで実行されます。
- モジュールを見つけ、必要に応じてロードして初期化します
- import ステートメントが発生するスコープのローカル名前空間に1つまたは複数の名前を定義します。
ステートメントに複数の句(コンマで区切られている)が含まれている場合、句が個々のインポートステートメントに分割されているかのように、2つの手順が句ごとに別々に実行されます。
最初のステップであるモジュールの検索とロードの詳細は、インポートシステムのセクションで詳しく説明されています。このセクションでは、インポートできるさまざまなタイプのパッケージとモジュール、およびすべてのインポートシステムをカスタマイズするために使用できるフック。 このステップでの失敗は、モジュールが見つからなかったか、またはが、モジュールのコードの実行を含むモジュールの初期化中にエラーが発生したことを示している可能性があることに注意してください。
要求されたモジュールが正常に取得されると、次の3つの方法のいずれかでローカル名前空間で使用できるようになります。
- モジュール名の後に
as
が続く場合、as
に続く名前はインポートされたモジュールに直接バインドされます。 - 他の名前が指定されておらず、インポートされるモジュールが最上位モジュールである場合、モジュールの名前は、インポートされたモジュールへの参照としてローカル名前空間にバインドされます。
- インポートされるモジュールがトップレベルモジュールではなくである場合、モジュールを含むトップレベルパッケージの名前は、トップレベルパッケージへの参照としてローカル名前空間にバインドされます。 インポートされたモジュールには、直接ではなく、完全修飾名を使用してアクセスする必要があります
from フォームは、もう少し複雑なプロセスを使用します。
- from 句で指定されたモジュールを見つけ、必要に応じてロードして初期化します。
- import 句で指定された識別子ごとに:
- インポートされたモジュールにその名前の属性があるかどうかを確認します
- そうでない場合は、その名前のサブモジュールをインポートしてから、インポートしたモジュールでその属性を再度確認してください。
- 属性が見つからない場合、 ImportError が発生します。
- それ以外の場合、その値への参照はローカル名前空間に格納され、存在する場合は
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 ステートメントが発生するスコープのローカル名前空間にバインドされます。
モジュールによって定義されたパブリック名は、モジュールの名前空間で__all__
という名前の変数をチェックすることによって決定されます。 定義されている場合は、そのモジュールによって定義またはインポートされた名前である文字列のシーケンスである必要があります。 __all__
で指定された名前はすべて公開されていると見なされ、存在する必要があります。 __all__
が定義されていない場合、パブリック名のセットには、モジュールの名前空間で見つかった、アンダースコア文字('_'
)で始まらないすべての名前が含まれます。 __all__
には、パブリックAPI全体が含まれている必要があります。 APIの一部ではないアイテム(モジュール内でインポートおよび使用されたライブラリモジュールなど)を誤ってエクスポートしないようにすることを目的としています。
ワイルドカード形式のインポート— from module import *
—は、モジュールレベルでのみ許可されます。 クラスまたは関数の定義で使用しようとすると、 SyntaxError が発生します。
インポートするモジュールを指定する場合、モジュールの絶対名を指定する必要はありません。 モジュールまたはパッケージが別のパッケージに含まれている場合、パッケージ名を指定しなくても、同じ最上位パッケージ内で相対インポートを行うことができます。 from の後に指定されたモジュールまたはパッケージの先頭のドットを使用することにより、正確な名前を指定せずに、現在のパッケージ階層をトラバースする高さを指定できます。 1つの先頭のドットは、インポートを行うモジュールが存在する現在のパッケージを意味します。 2つのドットは、1つのパッケージレベルを意味します。 3つのドットは2レベル上にあります。 したがって、pkg
パッケージのモジュールからfrom . import mod
を実行すると、pkg.mod
がインポートされることになります。 pkg.subpkg1
内からfrom ..subpkg2 import mod
を実行すると、pkg.subpkg2.mod
がインポートされます。 相対インポートの仕様は、パッケージの相対インポートセクションに含まれています。
importlib.import_module()は、ロードするモジュールを動的に決定するアプリケーションをサポートするために提供されています。
7.11.1。 今後の声明
futureステートメントは、機能が標準になるPythonの指定された将来のリリースで使用できる構文またはセマンティクスを使用して、特定のモジュールをコンパイルする必要があるというコンパイラーへの指示です。
futureステートメントは、言語に互換性のない変更を導入するPythonの将来のバージョンへの移行を容易にすることを目的としています。 機能が標準になるリリースの前に、モジュールごとに新しい機能を使用できます。
future_stmt ::= "from" "__future__" "import" feature ["as" identifier] ("," feature ["as" identifier])* | "from" "__future__" "import" "(" feature ["as" identifier] ("," feature ["as" identifier])* [","] ")" 機能 ::= identifier
今後のステートメントは、モジュールの上部近くに表示する必要があります。 将来のステートメントの前に表示できる行は次のとおりです。
- モジュールdocstring(存在する場合)、
- コメント、
- 空白行、および
- その他の将来の声明。
futureステートメントを使用する必要がある唯一の機能はannotations
です( PEP 563 を参照)。
futureステートメントによって有効にされたすべての履歴機能は、Python3によって引き続き認識されます。 リストには、absolute_import
、division
、generators
、generator_stop
、unicode_literals
、print_function
、nested_scopes
が含まれます。 ]およびwith_statement
。 これらは常に有効になっているためすべて冗長であり、下位互換性のためにのみ保持されます。
将来のステートメントは、コンパイル時に特別に認識および処理されます。コア構造のセマンティクスへの変更は、多くの場合、異なるコードを生成することによって実装されます。 新しい機能によって互換性のない新しい構文(新しい予約語など)が導入される場合もあります。その場合、コンパイラーはモジュールを別の方法で解析する必要があります。 このような決定は、実行時まで延期することはできません。
特定のリリースについて、コンパイラーはどの機能名が定義されているかを認識しており、futureステートメントに不明な機能が含まれている場合はコンパイル時エラーが発生します。
直接実行時のセマンティクスは、他のインポートステートメントの場合と同じです。後で説明する標準モジュール __ future __ があり、futureステートメントの実行時に通常の方法でインポートされます。
興味深いランタイムセマンティクスは、futureステートメントによって有効になる特定の機能によって異なります。
このステートメントには特別なことは何もないことに注意してください。
import __future__ [as name]
それは将来の声明ではありません。 これは、特別なセマンティクスや構文の制限がない通常のインポートステートメントです。
将来のステートメントを含むモジュールM
で発生する組み込み関数 exec()および compile()の呼び出しによってコンパイルされたコードは、デフォルトで次を使用します。 futureステートメントに関連付けられた新しい構文またはセマンティクス。 これは、 compile()へのオプションの引数によって制御できます。詳細については、その関数のドキュメントを参照してください。
対話型インタプリタプロンプトで入力された将来のステートメントは、インタプリタセッションの残りの部分で有効になります。 インタプリタが -i オプションで開始され、実行するスクリプト名が渡され、スクリプトにfutureステートメントが含まれている場合、スクリプトの実行後に開始される対話型セッションで有効になります。
7.12。 NSglobal 声明
global_stmt ::= "global" identifier ("," identifier)*
global ステートメントは、現在のコードブロック全体を保持する宣言です。 これは、リストされた識別子がグローバルとして解釈されることを意味します。 global
なしでグローバル変数に割り当てることは不可能ですが、自由変数はグローバルとして宣言されずにグローバルを参照する場合があります。
global ステートメントにリストされている名前は、そのglobal
ステートメントの前にある同じコードブロックで使用しないでください。
グローバルステートメントにリストされている名前は、仮パラメーターとして、または for ループ制御ターゲット、クラス定義、関数定義、インポート[ X185X]ステートメント、または変数注釈。
プログラマーのメモ: global
is a directive to the parser. It
applies only to code parsed at the same time as the global
statement.
In particular, a global
statement contained in a string or code
object supplied to the built-in exec()
function does not affect the code
block 含む the function call, and code contained in such a string is
unaffected by global
statements in the code containing the function
call. The same applies to the eval()
and compile()
functions.
7.13。 NSnonlocal 声明
nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*
nonlocal ステートメントにより、リストされた識別子は、グローバルを除く最も近い囲みスコープ内の以前にバインドされた変数を参照します。 バインディングのデフォルトの動作は最初にローカル名前空間を検索することであるため、これは重要です。 このステートメントを使用すると、カプセル化されたコードで、グローバル(モジュール)スコープ以外のローカルスコープ外の変数を再バインドできます。
nonlocal ステートメントにリストされている名前は、 global ステートメントにリストされている名前とは異なり、囲んでいるスコープ内の既存のバインディングを参照する必要があります(新しいバインディングを作成する必要があるスコープはできません)。明確に決定されます)。
nonlocal ステートメントにリストされている名前は、ローカルスコープ内の既存のバインディングと衝突してはなりません。