の範囲はif __name__ == __main__
? このステートメントは、グローバル空間ですべてを網羅していますか?
4 に答える
if __name__ == '__main__'
ブロックに関して特別なことは何もありません。つまり、その範囲はそれが発生する場所によって決定されます。このようなブロックは通常トップレベルで発生するため、スコープはグローバルです。
このブロックが関数内で発生した場合、これは完全に正当であり、そのスコープはローカルになり__name__
ますが、モジュールで定義されたグローバル値に解決される場合を除きます。
>>> if __name__ == '__main__':
... x = 1
... print 'x' in globals()
True
edit : user4815162342 は、この if ステートメントを任意のスコープで記述できるという優れた点を示しています。ほとんどの場合、グローバル スコープで記述されます。
これは関数内にあります。
>>> def foo():
... if __name__ == '__main__':
... bar = 1
... foo()
... print 'bar' in globals()
False
Python にはブロック ローカル スコープがないため、if
ブロック内で使用する変数は、最も近い「実際の」スコープに追加されます。(if..main
ブロックの場合、通常はモジュールの属性になります。)
次の場合に限り、グローバル スコープ内にあります。
- グローバルスコープで呼び出されます。つまり、関数内からではありません
- 実行中のコード ファイルにあります。
(2) を説明するには:
コードが infoo.py
で、 inbar.py
にステートメントがあるとしますfrom foo import *
。この場合、if __name__ == "__main__":
ブロックインfoo.py
は実行されません。このブロックは、実行時にのみ実行されfoo.py
ます