def main() やるべきか

Posted on Tue 12 February 2019 in misc

if __name__ == '__main__':

このブロックにコードを書くと スクリプトをモジュールとしてインポートしたときには実行されません。一方で、スクリプトをコマンドラインから実行したりすると実行されます。「関数の名前が '__main__' だったら」という意味の if 文です。

次のようにわざわざ main 関数を定義しているサンプルがあったりもします。

def main():
    print('Hello')

if __name__ == '__main__':
    main()

個人的には、無駄に C や Java に合わせているようで気持ちが悪いので、どうしたら良いのかざっと調べてみました。 if __name__ == '__main__': についてはブログ記事やら質問サイトやらたくさん見つかりましたが、main 関数の是非についてはあまり見つかりません。

意味のありそうなものは、この if ブロックの中に変数を書くと、グローバル変数になるので予想外のところで影響が出る可能性がある、ということでした。関数名は main にする必要はありません。

うまいこと関数で値を受け渡してしまえば変数ができてしまうこともないですし、このブロックからしか実行できない処理が多いということはモジュールとしては使えない機能が多いということにもなるでしょう。個人的にはやはり main という名前の関数をつくるのはあまりうまいやり方ではない気がします。