2008年8月25日月曜日

python の条件文 if __name__ == '__main__':

1. メインモジュールの名前は __main__

Python のモジュールを眺めていると、ソースコードの最後の方で、以下の記述をしばしば見かける。

if __name__ == "__main__":
    # 処理...

__name__ とは? __main__ とは何を表しているのだろう?

6. モジュール によると、

… Python では定義をファイルに書いておき、スクリプトの中やインタプリタの対話インスタンス上で使う方法があります。このファイルを モジュール (module) と呼びます; モジュールにある定義は、他のモジュールや main モジュール (実行のトップレベルや電卓モードでアクセスできる変数の集まりを指します)import (取り込み) することができます。

モジュールは Python の定義や文が入ったファイルです。ファイル名はモジュール名に接尾語 ,py がついたものになります。モジュールの中では、(文字列の) モジュール名をグローバル変数 __name__ で取得できます

「実行のトップレベル」というのは、スクリプトを実行したモジュールを指す。また、「電卓モード」とは、対話モードのことのようだ。

4.1 名前づけと束縛 (naming and binding) によると、

あるモジュールの名前空間は、そのモジュールが最初に import された時に自動的に作成されます。スクリプトの主モジュール (main module)は常に __main__ と呼ばれます。

対話モードでモジュールの名前を確かめてみる。

C:\>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print __name__
__main__

確かに `__main__’ と表示された。

 

2. モジュールで __name__ により名前を取得する

ソースコード

以下の2つのモジュールがある。

  • a.py
  • b.py

b.pya.py を import する。

a.py

print __name__

b.py

import a
print __name__

 

実行した結果

b.py 上でスクリプトを実行すると、出力は、

a
__main__

一行目で

`a’

と表示された。これは a.py のモジュール名を表す。2行目で、

`__main__’

と表示された。これは、b.py を起点にスクリプトを実行したことにより、b.py がメインモジュールになったということ。

もし、a.py 上でスクリプトの実行を行えば、a.py 内の __name__ で`__main__’ と表示される。

 

メインモジュールの名前で条件分岐

a.py に、モジュールが main の場合に実行するコード追加し、 a.py 上で実行してみる。

print __name__

if __name__ == "__main__":
    print "a.py"

結果は、

__main__
a.py

しかし、b.py 上で実行した場合、

a
__main__

`a.py' は出力されない。なぜなら、a.py はこのときメインモジュールではないため。

 

3. 結論

以上より、

if __name__ == '__main__':

は、それが記述されているモジュール上で、スクリプトが実行されたときに実行される「ガード条件」ということになる。

参考記事

__name__ の Python の中での位置付けは、

を参照。