6. 簡単なステートメント—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/reference/simple stmts
移動先:案内検索

6.6。 簡単なステートメント

単純なステートメントは、単一の論理行内に含まれます。 セミコロンで区切られた1行に、いくつかの簡単なステートメントが表示される場合があります。 単純なステートメントの構文は次のとおりです。

  simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | print_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | future_stmt
                 | global_stmt
                 | exec_stmt

6.1。 式ステートメント

式ステートメントは、値の計算と書き込み、または(通常)プロシージャ(意味のある結果を返さない関数。Pythonでは、プロシージャは値None)を呼び出すために(ほとんどの場合インタラクティブに)使用されます。 式ステートメントの他の使用法は許可されており、場合によっては便利です。 式ステートメントの構文は次のとおりです。

  expression_stmt ::=  expression_list

式ステートメントは、式リスト(単一の式の場合もあります)を評価します。

インタラクティブモードでは、値がNoneでない場合、組み込みの repr()関数を使用して文字列に変換され、結果の文字列が標準出力に書き込まれます(セクション[を参照) X192X]印刷ステートメント)を1行に単独で。 (Noneを生成する式ステートメントは書き込まれないため、プロシージャー呼び出しによって出力が発生することはありません。)


6.2。 割り当てステートメント

割り当てステートメントは、名前を値に(再)バインドし、可変オブジェクトの属性またはアイテムを変更するために使用されます。

  Assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)
  target_list     ::=  target ("," target)* [","]
目標          ::=  identifier
                     | "(" target_list ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing

(最後の3つのシンボルの構文定義については、セクション Primarys を参照してください。)

代入ステートメントは、式リストを評価し(これは単一の式またはコンマ区切りのリストであり、後者はタプルを生成することに注意してください)、結果の単一のオブジェクトを各ターゲットリストに左から右に割り当てます。

割り当ては、ターゲット(リスト)の形式に応じて再帰的に定義されます。 ターゲットが可変オブジェクト(属性参照、サブスクリプション、またはスライス)の一部である場合、可変オブジェクトは最終的に割り当てを実行してその有効性を決定する必要があり、割り当てが受け入れられない場合は例外が発生する可能性があります。 さまざまな型によって守られる規則と発生する例外は、オブジェクト型の定義とともに示されます(セクション標準型階層を参照)。

ターゲットリストへのオブジェクトの割り当ては、次のように再帰的に定義されます。

  • ターゲットリストが単一のターゲットの場合:オブジェクトはそのターゲットに割り当てられます。
  • ターゲットリストがターゲットのコンマ区切りリストである場合:オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムで反復可能である必要があり、アイテムは左から右に、対応するターゲットに割り当てられます。

単一のターゲットへのオブジェクトの割り当ては、次のように再帰的に定義されます。

  • ターゲットが識別子(名前)の場合:


    • 現在のコードブロックの global ステートメントに名前が含まれていない場合、名前は現在のローカル名前空間のオブジェクトにバインドされます。

    • それ以外の場合:名前は現在のグローバル名前空間のオブジェクトにバインドされます。

    すでにバインドされている場合、名前はリバウンドされます。 これにより、以前に名前にバインドされていたオブジェクトの参照カウントがゼロになり、オブジェクトの割り当てが解除され、そのデストラクタ(存在する場合)が呼び出される可能性があります。

  • ターゲットが括弧または角括弧で囲まれたターゲットリストの場合:オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムで反復可能である必要があり、そのアイテムは左から右に、対応するものに割り当てられます。ターゲット。

  • ターゲットが属性参照の場合:参照内の一次式が評価されます。 割り当て可能な属性を持つオブジェクトを生成する必要があります。 そうでない場合は、TypeErrorが発生します。 次に、そのオブジェクトは、割り当てられたオブジェクトを指定された属性に割り当てるように求められます。 割り当てを実行できない場合は、例外が発生します(通常、必ずしもAttributeErrorである必要はありません)。

    注:オブジェクトがクラスインスタンスであり、属性参照が代入演算子の両側で発生する場合、RHS式a.xは、インスタンス属性または(インスタンス属性が存在しない場合)クラス属性のいずれかにアクセスできます。 LHSターゲットa.xは常にインスタンス属性として設定され、必要に応じて作成されます。 したがって、a.xの2つのオカレンスは、必ずしも同じ属性を参照するわけではありません。RHS式がクラス属性を参照する場合、LHSは割り当てのターゲットとして新しいインスタンス属性を作成します。

    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が発生します(添え字付きシーケンスへの割り当てでは、リストに新しいアイテムを追加できません)。

    プライマリがマッピングオブジェクト(ディクショナリなど)である場合、添え字はマッピングのキータイプと互換性のあるタイプである必要があり、マッピングは、割り当てられたオブジェクトに添え字をマッピングするキー/データムペアを作成するように求められます。 これにより、既存のキーと値のペアを同じキー値に置き換えるか、新しいキーと値のペアを挿入できます(同じ値のキーが存在しない場合)。

  • ターゲットがスライスの場合:参照のプライマリ式が評価されます。 可変シーケンスオブジェクト(リストなど)を生成する必要があります。 割り当てられるオブジェクトは、同じタイプのシーケンスオブジェクトである必要があります。 次に、下限式と上限式が存在する限り、それらが評価されます。 デフォルトはゼロで、シーケンスの長さです。 境界は(小さい)整数に評価される必要があります。 いずれかの境界が負の場合、シーケンスの長さがそれに追加されます。 結果の境界は、ゼロとシーケンスの長さの間に収まるようにクリップされます。 最後に、シーケンスオブジェクトは、スライスを割り当てられたシーケンスのアイテムに置き換えるように求められます。 スライスの長さは、割り当てられたシーケンスの長さと異なる場合があります。したがって、オブジェクトで許可されている場合は、ターゲットシーケンスの長さが変更されます。

警告:割り当ての定義は、左側と右側の間のオーバーラップが「安全」であることを意味しますが(たとえば、a, b = b, aは2つの変数を交換します)、コレクション内でオーバーラップします割り当てられた変数の数は安全ではありません! たとえば、次のプログラムは[0, 2]を出力します。

x = [0, 1]
i = 0
i, x[i] = 1, 2
print x

6.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回だけ評価されます。 また、可能な場合、実際の操作はインプレースで実行されます。つまり、新しいオブジェクトを作成してターゲットに割り当てるのではなく、古いオブジェクトが変更されます。

1つのステートメントでタプルと複数のターゲットに割り当てることを除いて、拡張された割り当てステートメントによって行われる割り当ては、通常の割り当てと同じ方法で処理されます。 同様に、可能なインプレース動作を除いて、拡張代入によって実行される2項演算は、通常の2項演算と同じです。

属性参照であるターゲットの場合、クラスおよびインスタンス属性に関する同じ警告が通常の割り当ての場合と同じように適用されます。


6.3。 NS 主張する声明

アサーションステートメントは、デバッグアサーションをプログラムに挿入するための便利な方法です。

  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 __ への割り当ては不正です。 組み込み変数の値は、インタープリターの起動時に決定されます。


6.4。 NS 合格声明

  pass_stmt ::=  "pass"

pass はnull操作です—実行されても、何も起こりません。 ステートメントが構文的に必要であるが、コードを実行する必要がない場合のプレースホルダーとして役立ちます。次に例を示します。

def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)

6.5。 NS デル声明

  del_stmt ::=  "del" target_list

削除は、割り当ての定義方法と非常によく似た再帰的定義です。 完全に詳しく説明するのではなく、ここにいくつかのヒントがあります。

ターゲットリストを削除すると、各ターゲットが左から右に再帰的に削除されます。

名前を削除すると、その名前が同じコードブロック内の global ステートメントにあるかどうかに応じて、ローカルまたはグローバル名前空間からその名前のバインディングが削除されます。 名前がバインドされていない場合、NameError例外が発生します。

ネストされたブロックで自由変数として出現する場合、ローカル名前空間から名前を削除することは違法です。

属性参照、サブスクリプション、およびスライスの削除は、関連するプライマリオブジェクトに渡されます。 スライスの削除は、一般に、適切なタイプの空のスライスの割り当てと同等です(ただし、これでもスライスされたオブジェクトによって決定されます)。


6.6。 NS 印刷声明

  print_stmt ::=  "print" ([expression ("," expression)* [","]]
                | ">>" expression [("," expression)+ [","]])

print は、各式を順番に評価し、結果のオブジェクトを標準出力に書き込みます(以下を参照)。 オブジェクトが文字列でない場合は、最初に文字列変換のルールを使用して文字列に変換されます。 次に、(結果または元の)文字列が書き込まれます。 出力システムがオブジェクトが行の先頭にあると信じない限り、各オブジェクトが(変換されて)書き込まれる前にスペースが書き込まれます。 これは、(1)標準出力にまだ文字が書き込まれていない場合、(2)標準出力に書き込まれる最後の文字が' '以外の空白文字である場合、または(3)最後の書き込み操作の場合です。標準出力では、 print ステートメントではありませんでした。 (このため、標準出力に空の文字列を書き込むことが機能する場合があります。)

ノート

ファイルオブジェクトのように機能するが、組み込みのファイルオブジェクトではないオブジェクトは、ファイルオブジェクトの動作のこの側面を適切にエミュレートしないことが多いため、これに依存しないことをお勧めします。


print ステートメントがコンマで終わっていない限り、'\n'文字が最後に書き込まれます。 ステートメントにキーワード print のみが含まれている場合、これが唯一のアクションです。

標準出力は、組み込みモジュール sysstdoutという名前のファイルオブジェクトとして定義されています。 そのようなオブジェクトが存在しない場合、またはwrite()メソッドがない場合、RuntimeError例外が発生します。

print にも拡張形式があり、上記の構文の2番目の部分で定義されています。 このフォームは、「 print シェブロン」と呼ばれることもあります。 この形式では、>>の後の最初の式は、「ファイルのような」オブジェクト、具体的には上記のwrite()メソッドを持つオブジェクトに評価される必要があります。 この拡張フォームを使用すると、後続の式がこのファイルオブジェクトに出力されます。 最初の式がNoneと評価された場合、sys.stdoutが出力用のファイルとして使用されます。


6.7。 NS 戻る声明

  return_stmt ::=  "return" [expression_list]

return は、ネストされたクラス定義内ではなく、関数定義内で構文的にネストされた場合にのみ発生する可能性があります。

式リストが存在する場合は評価され、存在しない場合はNoneに置き換えられます。

return は、現在の関数呼び出しを式リスト(またはNone)として残します。

returnfinally 句を含む try ステートメントから制御を渡すと、その finally 句が実際に関数を終了する前に実行されます。

ジェネレーター関数では、 return ステートメントに expression_list を含めることはできません。 そのコンテキストでは、裸の return は、ジェネレーターが完了し、StopIterationが発生することを示します。


6.8。 NS 収率声明

  yield_stmt ::=  yield_expression

yield ステートメントは、ジェネレーター関数を定義するときにのみ使用され、ジェネレーター関数の本体でのみ使用されます。 関数定義で yield ステートメントを使用するだけで、その定義で通常の関数ではなくジェネレーター関数を作成できます。

ジェネレーター関数が呼び出されると、ジェネレーターイテレーター、またはより一般的にはジェネレーターと呼ばれるイテレーターが返されます。 ジェネレーター関数の本体は、ジェネレーターの next()メソッドを、例外が発生するまで繰り返し呼び出すことによって実行されます。

yield ステートメントが実行されると、ジェネレーターの状態が凍結され、 expression_list の値が next()の呼び出し元に返されます。 「凍結」とは、ローカル変数の現在のバインディング、命令ポインター、内部評価スタックなど、すべてのローカル状態が保持されることを意味します。次回 next()が実行されるように、十分な情報が保存されます。呼び出されると、関数は yield ステートメントが単なる別の外部呼び出しであるかのように正確に続行できます。

Pythonバージョン2.5以降、 yield ステートメントが tryfinally コンストラクトの try 句で許可されるようになりました。 ジェネレーターがファイナライズされる前に再開されない場合(参照カウントがゼロになるか、ガベージコレクションされることにより)、ジェネレーターイテレーターのclose()メソッドが呼び出され、保留中の finally 句が許可されます。実行します。

利回りセマンティクスの詳細については、利回り式セクションを参照してください。

ノート

Python 2.2では、 yield ステートメントは、generators機能が有効になっている場合にのみ許可されていました。 この__future__インポートステートメントは、次の機能を有効にするために使用されました。

from __future__ import generators

も参照してください

PEP 255 -シンプルなジェネレーター
ジェネレーターと yield ステートメントをPythonに追加するための提案。
PEP 342 -拡張ジェネレーターを介したコルーチン
他のジェネレーターの機能強化の中でも、利回りtryfinally ブロック内に表示できるようにすることを提案した提案。


6.9。 NS 高める声明

  raise_stmt ::=  "raise" [expression ["," expression ["," expression]]]

式が存在しない場合、 raise は、現在のスコープでアクティブだった最後の例外を再発生させます。 現在のスコープでアクティブな例外がない場合は、TypeError例外が発生し、これがエラーであることを示します(IDLEで実行している場合は、代わりに Queue.Empty 例外が発生します)。

それ以外の場合、 raise は、省略された式の値としてNoneを使用して、式を評価して3つのオブジェクトを取得します。 最初の2つのオブジェクトは、例外のタイプを決定するために使用されます。

最初のオブジェクトがインスタンスの場合、例外のタイプはインスタンスのクラスであり、インスタンス自体は値であり、2番目のオブジェクトはNoneである必要があります。

最初のオブジェクトがクラスの場合、それが例外のタイプになります。 2番目のオブジェクトは、例外値を決定するために使用されます。それがクラスのインスタンスである場合、インスタンスは例外値になります。 2番目のオブジェクトがタプルの場合、クラスコンストラクターの引数リストとして使用されます。 Noneの場合、空の引数リストが使用され、その他のオブジェクトはコンストラクターに対する単一の引数として扱われます。 コンストラクターを呼び出して作成されたインスタンスが例外値として使用されます。

Noneではなく3番目のオブジェクトが存在する場合、それはトレースバックオブジェクトである必要があり(セクション標準タイプ階層を参照)、現在の場所の代わりに、例外が発生しました。 3番目のオブジェクトが存在し、トレースバックオブジェクトまたはNoneが存在しない場合、TypeError例外が発生します。 raise の3つの式の形式は、except句で例外を透過的に再発生させるのに役立ちますが、再発生する例外が現在のスコープで最後にアクティブな例外。

例外に関する追加情報はセクション例外にあり、例外の処理に関する情報はセクション tryステートメントにあります。


6.10。 NS 壊す声明

  break_stmt ::=  "break"

break は、 for または while ループに構文的にネストされている場合にのみ発生しますが、そのループ内の関数またはクラス定義にはネストされていません。

ループにオプションの else 句がある場合はスキップして、最も近い囲んでいるループを終了します。

for ループが break で終了した場合、ループ制御ターゲットは現在の値を保持します。

breakfinally 句を含む try ステートメントから制御を渡すと、その finally 句が実際にループを離れる前に実行されます。


6.11。 NS 継続する声明

  continue_stmt ::=  "continue"

Continue は、 for または while ループに構文的にネストされている場合にのみ発生しますが、関数またはクラス定義、または finally 句にネストされていません。そのループ。 これは、最も近い囲みループの次のサイクルに続きます。

continuetry ステートメントから finally 句を使用して制御を渡すと、その finally 句が実行されてから次のループサイクルが実際に開始されます。 。


6.12。 NS 輸入声明

  import_stmt     ::=  "import" module ["as" name] ( "," module ["as" name] )*
                     | "from" relative_module "import" identifier ["as" name]
                     ( "," identifier ["as" name] )*
                     | "from" relative_module "import" "(" identifier ["as" name]
                     ( "," identifier ["as" name] )* [","] ")"
                     | "from" module "import" "*"
モジュール          ::=  (identifier ".")* identifier
  related_module ::=  "."* module | "."+
名前            ::=  identifier

インポートステートメントは、次の2つのステップで実行されます。(1)モジュールを見つけ、必要に応じて初期化します。 (2)( import ステートメントが発生するスコープの)ローカル名前空間で1つまたは複数の名前を定義します。 このステートメントは、 from キーワードを使用するかどうかによって異なる2つの形式で提供されます。 最初の形式( from なし)は、リスト内の識別子ごとにこれらの手順を繰り返します。 from のフォームは、ステップ(1)を1回実行してから、ステップ(2)を繰り返し実行します。

手順(1)がどのように発生するかを理解するには、まずPythonがモジュールの階層的な命名をどのように処理するかを理解する必要があります。 モジュールを整理し、命名の階層を提供するために、Pythonにはパッケージの概念があります。 パッケージには他のパッケージやモジュールを含めることができますが、モジュールには他のモジュールやパッケージを含めることはできません。 ファイルシステムの観点からは、パッケージはディレクトリであり、モジュールはファイルです。

モジュールの名前がわかれば(特に指定がない限り、「モジュール」という用語はパッケージとモジュールの両方を指します)、モジュールまたはパッケージの検索を開始できます。 最初にチェックされるのは sys.modules で、これは以前にインポートされたすべてのモジュールのキャッシュです。 モジュールがそこで見つかった場合は、インポートのステップ(2)で使用されます。

モジュールがキャッシュに見つからない場合は、 sys.meta_path が検索されます( sys.meta_path の仕様は、 PEP302にあります。 )。 オブジェクトは、モジュールの名前を指定してfind_module()メソッドを呼び出すことにより、モジュールのロード方法を知っているかどうかを確認するために照会される finder オブジェクトのリストです。 モジュールがパッケージ内に含まれている場合(名前にドットが含まれていることで示されます)、find_module()への2番目の引数が__path__属性の値として指定されます。親パッケージ(インポートされるモジュールの名前の最後のドットまでのすべて)。 ファインダーがモジュールを見つけることができる場合、ローダー(後で説明)を返すか、Noneを返します。

sys.meta_path のどのファインダーもモジュールを見つけることができない場合、いくつかの暗黙的に定義されたファインダーが照会されます。 Pythonの実装は、暗黙のメタパスファインダーが定義されているものによって異なります。 ただし、それらすべてが定義するのは、 sys.path_hookssys.path_importer_cache 、および sys.path を処理するものです。

暗黙のファインダーは、2つの場所のいずれかで指定された「パス」で要求されたモジュールを検索します(「パス」はファイルシステムパスである必要はありません)。 インポートされるモジュールがパッケージ内に含まれていると想定される場合、親パッケージのfind_module()__path__に渡される2番目の引数がパスのソースとして使用されます。 モジュールがパッケージに含まれていない場合は、 sys.path がパスのソースとして使用されます。

パスのソースが選択されると、そのパスを処理できるファインダーを見つけるために繰り返されます。 sys.path_importer_cache のdictは、パスのファインダーをキャッシュし、ファインダーがチェックされます。 パスにファインダーがキャッシュされていない場合、 sys.path_hooks は、パスの単一の引数を使用してリスト内の各オブジェクトを呼び出すか、ファインダーを返すか、ImportErrorを発生させることによって検索されます。 ファインダーが返されると、 sys.path_importer_cache にキャッシュされ、そのパスエントリに使用されます。 ファインダーが見つからないがパスが存在する場合は、Noneの値が sys.path_importer_cache に保存され、個々のファイルとして保存されたモジュールを処理する暗黙のファイルベースのファインダーが必要であることを示します。そのパスに使用されます。 パスが存在しない場合は、常にNoneを返すファインダーがパスのキャッシュに配置されます。

ファインダーがモジュールを見つけることができない場合、ImportErrorが発生します。 それ以外の場合、一部のファインダーは、ロードするモジュールの名前でload_module()メソッドが呼び出されるローダーを返しました(ローダーの元の定義については、 PEP 302 を参照してください)。 ローダーには、ロードするモジュールに対して実行するいくつかの責任があります。 まず、モジュールが sys.modules にすでに存在する場合(ローダーがインポート機構の外部で呼び出される可能性があります)、新しいモジュールではなく、そのモジュールを初期化に使用します。 ただし、モジュールが sys.modules に存在しない場合は、初期化を開始する前にそのdictに追加する必要があります。 モジュールのロード中にエラーが発生し、それが sys.modules に追加された場合、それはdictから削除されます。 エラーが発生したが、モジュールがすでに sys.modules にあった場合、それはdictに残されます。

ローダーは、モジュールにいくつかの属性を設定する必要があります。 __name__はモジュールの名前に設定されます。 __file__は、モジュールが組み込まれていない限り(したがって、 sys.builtin_module_names にリストされている場合)、ファイルへの「パス」になります。組み込みの場合、属性は設定されません。 インポートされるものがパッケージである場合、__path__は、インポートされるパッケージに含まれるモジュールおよびパッケージを検索するときに検索されるパスのリストに設定されます。 __package__はオプションですが、モジュールまたはパッケージを含むパッケージの名前に設定する必要があります(パッケージに含まれていないモジュールには空の文字列が使用されます)。 __loader__もオプションですが、モジュールをロードしているローダーオブジェクトに設定する必要があります。

ロード中にエラーが発生した場合、他の例外がまだ伝播されていなければ、ローダーはImportErrorを発生させます。 それ以外の場合、ローダーはロードおよび初期化されたモジュールを返します。

手順(1)が例外を発生させずに終了すると、手順(2)を開始できます。

import ステートメントの最初の形式は、ローカル名前空間のモジュール名をモジュールオブジェクトにバインドし、次の識別子がある場合はそれをインポートします。 モジュール名の後に as が続く場合、 as に続く名前がモジュールのローカル名として使用されます。

from フォームは、モジュール名をバインドしません。識別子のリストを調べ、手順(1)で見つかったモジュールで各識別子を検索し、ローカル名前空間の名前をにバインドします。このようにして見つかったオブジェクト。 import の最初の形式と同様に、「 as localname」を指定することで代替ローカル名を指定できます。 名前が見つからない場合は、ImportErrorが発生します。 識別子のリストがスター('*')に置き換えられた場合、モジュールで定義されたすべてのパブリック名は、 import ステートメントのローカル名前空間にバインドされます。

モジュールによって定義されたパブリック名は、モジュールの名前空間で__all__という名前の変数をチェックすることによって決定されます。 定義されている場合は、そのモジュールによって定義またはインポートされた名前である文字列のシーケンスである必要があります。 __all__で指定された名前はすべて公開されていると見なされ、存在する必要があります。 __all__が定義されていない場合、パブリック名のセットには、モジュールの名前空間で見つかった、アンダースコア文字('_')で始まらないすべての名前が含まれます。 __all__には、パブリックAPI全体が含まれている必要があります。 APIの一部ではないアイテム(モジュール内でインポートおよび使用されたライブラリモジュールなど)を誤ってエクスポートしないようにすることを目的としています。

from フォームと*は、モジュールスコープでのみ発生する可能性があります。 ワイルドカード形式のインポート(import *)が関数で使用され、関数に自由変数が含まれるかネストされたブロックである場合、コンパイラーはSyntaxErrorを生成します。

インポートするモジュールを指定する場合、モジュールの絶対名を指定する必要はありません。 モジュールまたはパッケージが別のパッケージに含まれている場合、パッケージ名を指定しなくても、同じ最上位パッケージ内で相対インポートを行うことができます。 from の後に指定されたモジュールまたはパッケージの先頭のドットを使用することにより、正確な名前を指定せずに、現在のパッケージ階層をトラバースする高さを指定できます。 1つの先頭のドットは、インポートを行うモジュールが存在する現在のパッケージを意味します。 2つのドットは、1つのパッケージレベルを意味します。 3つのドットは2レベル上にあります。 したがって、pkgパッケージのモジュールからfrom . import modを実行すると、pkg.modがインポートされることになります。 pkg.subpkg1内からfrom ..subpkg2 import modを実行すると、pkg.subpkg2.modがインポートされます。 相対インポートの仕様は、 PEP 328 に含まれています。

importlib.import_module()は、動的にロードする必要のあるモジュールを決定するアプリケーションをサポートするために提供されています。

6.12.1。 今後の声明

futureステートメントは、Pythonの指定された将来のリリースで使用可能になる構文またはセマンティクスを使用して、特定のモジュールをコンパイルする必要があるというコンパイラーへのディレクティブです。 futureステートメントは、言語に互換性のない変更を導入するPythonの将来のバージョンへの移行を容易にすることを目的としています。 機能が標準になるリリースの前に、モジュールごとに新しい機能を使用できます。

  future_statement ::=  "from" "__future__" "import" feature ["as" name]
                      ("," feature ["as" name])*
                      | "from" "__future__" "import" "(" feature ["as" name]
                      ("," feature ["as" name])* [","] ")"
特徴          ::=  identifier
名前             ::=  identifier

今後のステートメントは、モジュールの上部近くに表示する必要があります。 将来のステートメントの前に表示できる行は次のとおりです。

  • モジュールdocstring(存在する場合)、
  • コメント、
  • 空白行、および
  • その他の将来の声明。

Python 2.6で認識される機能は、unicode_literalsprint_functionabsolute_importdivisiongeneratorsnested_scopes、[ X111X] 。 generatorswith_statementnested_scopesは、常に有効になっているため、Pythonバージョン2.6以降では冗長です。

将来のステートメントは、コンパイル時に特別に認識および処理されます。コア構造のセマンティクスへの変更は、多くの場合、異なるコードを生成することによって実装されます。 新しい機能によって互換性のない新しい構文(新しい予約語など)が導入される場合もあります。その場合、コンパイラーはモジュールを別の方法で解析する必要があります。 このような決定は、実行時まで延期することはできません。

特定のリリースについて、コンパイラーはどの機能名が定義されているかを認識しており、futureステートメントに不明な機能が含まれている場合はコンパイル時エラーが発生します。

直接実行時のセマンティクスは、他のインポートステートメントの場合と同じです。後で説明する標準モジュール __ future __ があり、futureステートメントの実行時に通常の方法でインポートされます。

興味深いランタイムセマンティクスは、futureステートメントによって有効になる特定の機能によって異なります。

このステートメントには特別なことは何もないことに注意してください。

import __future__ [as name]

それは将来の声明ではありません。 これは、特別なセマンティクスや構文の制限がない通常のインポートステートメントです。

exec ステートメントによってコンパイルされたコード、またはモジュールMで発生する組み込み関数 compile()および execfile()の呼び出しによってコンパイルされたコードfutureステートメントを含む場合、デフォルトでは、futureステートメントに関連付けられた新しい構文またはセマンティクスが使用されます。 これは、Python 2.2以降、 compile()へのオプションの引数によって制御できます。詳細については、その関数のドキュメントを参照してください。

対話型インタプリタプロンプトで入力された将来のステートメントは、インタプリタセッションの残りの部分で有効になります。 インタプリタが -i オプションで開始され、実行するスクリプト名が渡され、スクリプトにfutureステートメントが含まれている場合、スクリプトの実行後に開始される対話型セッションで有効になります。

も参照してください

PEP 236 -__ future__に戻る
__future__メカニズムの元の提案。


6.13。 NS グローバル声明

  global_stmt ::=  "global" identifier ("," identifier)*

global ステートメントは、現在のコードブロック全体を保持する宣言です。 これは、リストされた識別子がグローバルとして解釈されることを意味します。 global なしでグローバル変数に割り当てることは不可能ですが、自由変数はグローバルとして宣言されずにグローバルを参照する場合があります。

global ステートメントにリストされている名前は、その global ステートメントの前にある同じコードブロックで使用しないでください。

global ステートメントにリストされている名前は、正式なパラメーターとして、または for ループ制御ターゲット、クラス定義、関数定義、または importで定義してはなりません。 ステートメント。

プログラマーのメモ: 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 an exec statement does not affect the code block 含む the exec statement, and code contained in an exec statement is unaffected by global statements in the code containing the exec statement. The same applies to the eval(), execfile() and compile() functions.


6.14。 NS exec 声明

  exec_stmt ::=  "exec" or_expr ["in" expression ["," expression]]

このステートメントは、Pythonコードの動的実行をサポートします。 最初の式は、Unicode文字列、 Latin-1 でエンコードされた文字列、開いているファイルオブジェクト、コードオブジェクト、またはタプルのいずれかに評価される必要があります。 文字列の場合、文字列はPythonステートメントのスイートとして解析され、実行されます(構文エラーが発生しない限り)。 1 開いているファイルの場合、ファイルはEOFまで解析されて実行されます。 コードオブジェクトの場合は、単純に実行されます。 タプルの解釈については、以下を参照してください。 いずれの場合も、実行されるコードはファイル入力として有効であることが期待されます(セクションファイル入力を参照)。 return および yield ステートメントは、 exec ステートメントに渡されるコードのコンテキスト内であっても、関数定義の外部で使用できないことに注意してください。

いずれの場合も、オプション部分を省略した場合、コードは現在のスコープで実行されます。 inの後の最初の式のみを指定する場合は、グローバル変数とローカル変数の両方に使用される辞書である必要があります。 2つの式が指定されている場合、それらはそれぞれグローバル変数とローカル変数に使用されます。 提供されている場合、 locals は任意のマッピングオブジェクトにすることができます。 モジュールレベルでは、グローバルとローカルは同じディクショナリであることを忘れないでください。 2つの別々のオブジェクトが globals および locals として指定されている場合、コードはクラス定義に埋め込まれているかのように実行されます。

最初の式は、長さが2または3のタプルの場合もあります。 この場合、オプションパーツは省略してください。 exec(expr, globals)の形式はexec expr in globalsと同等であり、exec(expr, globals, locals)の形式はexec expr in globals, localsと同等です。 execのタプル形式は、Python 3との互換性を提供します。ここで、execはステートメントではなく関数です。

バージョン2.4で変更:以前は、 locals は辞書である必要がありました。


副作用として、実装は、実行されたコードによって設定された変数名に対応するものに加えて、与えられた辞書に追加のキーを挿入する場合があります。 たとえば、現在の実装では、キー__builtins__(!)の下に組み込みモジュール __ builtin __ のディクショナリへの参照を追加できます。

プログラマーのヒント:式の動的評価は、組み込み関数 eval()によってサポートされています。 組み込み関数 globals()locals()は、それぞれ現在のグローバル辞書とローカル辞書を返します。これは、 exec で使用するために渡すのに便利です。 ]。

脚注

1
パーサーはUnixスタイルの行末規則のみを受け入れることに注意してください。 ファイルからコードを読み取る場合は、必ずユニバーサル改行モードを使用して、WindowsまたはMacスタイルの改行を変換してください。