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により呼び出されました
だからと言ってなんだよ、という話だが・・・
コメント