プロジェクト構造に関する Python ガイドの章では、「トップレベル ステートメント」という用語が数回取り上げられています。これが何を指しているのか正確にはわかりません。私の推測では、モジュールがロードされるとすぐに起動する関数またはクラス メソッドの外側で発生する変数宣言です。これは正しいです?モジュールのimport
ステートメントも含まれていますか?
3 に答える
単なる変数宣言ではありません (とにかく変数宣言はありません)。これは、インデント レベル 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
「トップレベルステートメント」の最初の言及は次のとおりです。
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
です。