【Python】if __name__ == “__main__”: とは何なのか

Tips

Pythonにてmain関数を使う時におまじないのように書いている

if __name__ == "__main__":
  main()

というコード。

今まで深く考えていなかったが、これはどういう意味があるのか気になったので覚え書いておく。

 

__name__とは

コード自体の意味は分かる。

単純に__name__という変数が”__main__”というものであればmain()関数を呼び出すだけである。

では、__name__とはどういう変数なのか。

そもそもそんな変数は自分では宣言していない。

 

というわけで例のごとくGoogleで調べてみたら、この__name__という変数はPythonの特殊なグローバル変数であるとのこと。

この変数には、Pythonプログラムの呼び出し元を格納する機能があるらしい。

 

文字で説明してもよくわからないので、実際にテスト用のプログラムを作成してみた。

 

テストプログラム

printName.py

# coding:utf-8

print(__name__)

単純に__name__を標準出力するだけのpythonプログラム。

これを色々なものから呼び出してみる。

 

yobidashi.py

# coding:utf-8

import printName

printName.pyをimportするだけ。

 

テスト実施

CLIから直接実行する

$ python printName.py
__main__

CLIにて直接呼び出すと、__name__には”__main__”という値が入ることが分かった。

これを利用してimportしたときの実行暴発を防いでいることが分かる。

 

yobidashi.pyから実行する

$ python yobidashi.py
printName

yobidashi.pyにてimportしてprintName.pyを実行すると、__name__には”printName”が代入される。

おそらくimportしたときのモジュール名がそのまま__name__に格納されるのだと思われる。

 

応用

これを利用して、CLIで直接呼び出された時の挙動とimportにより呼び出された時の挙動を変えることもできる。

というわけで検証用プログラムを書いてみた。

# coding:utf-8

if __name__ == '__main__':
  print('直接呼び出されました')
elif __name__ == 'printName':
  print('importにより呼び出されました')

実行結果は以下の通り。

$ python printName.py
直接呼び出されました
$ python yobidashi.py
importにより呼び出されました

だからと言ってなんだよ、という話だが・・・

 

コメント

タイトルとURLをコピーしました