コードの例などでよく見る if __name__ == '__main__'について、ずっとモヤらせていたものを調べたので記録。
if name == 'main' とはなにか
簡単に言えば、「外部からimportして読み込んだときに実行されないようにするため」のもの。
pythonは同じディレクトリであればimport ファイル名でモジュールとして読み込みができる。この読み込みのときにはコード全体が実行されるため、平文で書いていたらimportしたときに値が返ってきてしまう。
たとえば、
hello.py
print('hello world')
上のコードを別のファイルから import helloとすると読み込めるが、読み込みと同時にhello worldと返ってきてしまう。これはいけてない。し、場合によっては不具合がでうる。
それを防ぐためには、
hello.py
if __name__ == '__main__':
print('hello world')
とするだけでOK。
なぜか
どうやらimportする際には内部で__name__という変数にモジュール名が与えられているらしい。
hello.pyをモジュールとして実行すると__name__はhelloになる。
なのでif文は実行されなかったという仕組みっぽい。