今回は、プログラム中でよく見かける__name__
や__main__
に関して記述していきたいと思います。
開発環境
MacOS
Python3.7(anaconda)
VSCode
Pythonのif name == "main" とは何ですか?への回答
ファイルをimportすると実行までされてしまう問題
言葉で説明するよりも実際にコードを実行して確認する方がわかりやすいと思いますので。
def hello():
print('Hello World')
hello() -> Hello World
このコードを実行すると、もちろんHello World
が出力されます。
そこで、ふとこのhello関数
を別のファイルに読み込みたいなと思ったときはファイルaを別のファイル上でimport
をすると思います。
import a -> Hello World
しかし、ここで困ったことに、ファイルa
が実行までされてしまうのです。
お分かりでしょうか?
別のファイルにある関数を使って処理をしたいだけなのに、実行までされてしまうので良い迷惑ですよね。
__name__
とは
とあるファイルa.py
において、このファイルを実行すると、__main__
が出力されます。
def A():
print(__name__)
A() -> __main__
つまり、__name__
の中は通常であれば、__main__
が入力されることになります。
ファイルaをファイルbにimportする
ここで、先ほどと同じようにファイルa
をファイルb
にimportします。
先ほどと同じであれば、ファイルbにimportしただけで、__main__
が出力されるということになります。
import a -> a
しかし、今回出力されるのは、importされたファイル名
であるa
なのです。
__name__は別のモジュール(ファイル)にimportされたら中身が変わる
通常であれば、__main__
が入ってくるというのが__name__
でしたが、importされて別のファイル上で実行されるという状況になった場合、__name__
の中身は、importされたファイル名(モジュール名)
になります。
if __name__
== '__main__'
:とは何なのか
if __name__ == '__main__':
はこの条件文が書かれたファイルが別のファイルにimportされていない場合だけ、条件文以下のコードを実行する、という意味になります。
def hello():
print('Hello World')
if __name__ == '__main__':
hello()
def A():
print(__name__)
A()
ファイルa
をファイルb
にimportした場合に、if __name__ == '__main__':
が無ければ、__name__
の中身が__main__
ではなく、ファイル名であるa
に代わるので、Hello World
とa
が出力されます。
import a -> a
しかし、今回は、ファイルaにif __name__ == '__main__':
が記述されており、__name__
の中身は__main__
ではなくっているため、hello()
は実行されず、a
のみが出力されました。
まとめ
if __name__ == '__main__':
は不思議な条件式のように見えますが、ちゃんと理解すると必要な条件式だなと思いました。
importされたファイルは実行までされる
というのがわかっていないと必要性を感じないのではないかと思いました。