15

プロジェクト構造に関する Python ガイドの章では、「トップレベル ステートメント」という用語が数回取り上げられています。これが何を指しているのか正確にはわかりません。私の推測では、モジュールがロードされるとすぐに起動する関数またはクラス メソッドの外側で発生する変数宣言です。これは正しいです?モジュールのimportステートメントも含まれていますか?

4

3 に答える 3

32

単なる変数宣言ではありません (とにかく変数宣言はありません)。これは、インデント レベル 0 から始まるほとんどすべてのものです。

import sys         # top-level

3 + 4              # top-level

x = 0              # top-level

def f():           # top-level
    import os      # not top-level!
    return 3       # not top-level

if x:              # top-level
    print 3        # not top-level
else:
    print 4        # not top-level, but executes as part of an if statement
                   # that is top-level

class TopLevel(object): # top-level
    x = 3          # not top-level, but executes as part of the class statement
    def foo(self): # not top-level, but executes as part of the class statement
        print 5    # not top-level
于 2013-08-09T00:04:30.587 に答える
3

「トップレベルステートメント」の最初の言及は次のとおりです。

modu.py が見つかると、Python インタープリターは分離されたスコープでモジュールを実行します。modu.py のトップレベルのステートメントが実行され、他のインポートがあれば実行されます。関数とクラスの定義は、モジュールの辞書に格納されます。

これは、それらが本当に意味するのは「そのimport時点で解釈されるもの」であることを明確にしています。

直接的にはあまり役に立ちませんが、Python のドキュメント自体でも「トップレベル」(コンポーネント、このコンテキストでは「ステートメント」を意味します) というフレーズを使用しています。

このモジュールは次の点に注意してください。

"""a python module, spam.py"""

def spam():
    return "spam"

class Spam(object):
    pass

には、 と の 2 つのステートメントがdefありclassます。これらは両方ともインポート時に実行されます。これらの定義は複合ステートメントです (defおよびclass説明を参照)。トップレベルにアタッチされたデコレーターがある場合def、実行するトップレベルのものがさらに追加されます。(user2357112の回答も参照してください。ステートメントを実行すると、classより多くの内部動作が呼び出されます。)

先頭に animport sysを追加すると、 imports という 3 番目のステートメントが追加されますsys。ただし、これを追加すると:

def ham(eggs):
    import os
    return os.path.basename(eggs)

def hamトップレベルのものには、まだ 1 つのステートメントしか追加していません。が実行されるのは、hamそれ自体が実行される (呼び出される)ときimport osです。

于 2013-08-09T00:06:45.403 に答える