【Python】main関数の定義は、なぜ必要なのか?
背景
現在 42Tokyo にて、Python の課題に挑戦中。
そこで困ったのが、「main関数を含めるべきかどうか?」ということです。
課題の要件には、「必ずmain関数を定義せよ」とあります。
しかし Python は、main関数を定義しなくても動きます。
課題には、指定された関数を定義すればそれで済むものも含まれており、mainが必要だとは思えませんでした。
そして、作ったプログラムを試す用のテストプログラムがすでに用意されている場合、main関数を入れるべきなのかどうかということが分かりませんでした。
(そのテストプログラムを実行しる際に、作ったプログラムはimportされて使用される)
結論から言うと、やはりmain関数はすべてのプログラムに含めるべきなのですが、この記事では、それがなぜなのかに迫っていきます。
大前提:main関数を定義するとは?
そもそもmain関数は、エントリポイント(プログラムの処理の開始地点)を分かりやすくするために作られる関数のこと。
そして、上記で語っている「main関数を定義せよ」とは、正確には、以下のコードを指しています。
main関数を定義したうえで、ファイルの末尾にif __name__ == "__main__":
と記載し、main
を呼び出しています。
def main():
...
if __name__ == "__main__":
main()
ここで__name__
には__main__
が入るのですが、その仕組みは以下のサイトにて。
https://docs.python.org/ja/3/library/main.html
それではさっそく、main関数を定義するメリットをみていきましょう。
メリット1: 関数定義の順番を気にしなくていい
Python では、関数は定義した「あと」でしか使うことができないので、以下のようなコードはエラー(NameError)になります。
function_a() #関数の使用
def function_a(): #関数の定義
...
しかし main関数を使うことで、以下のように関数の定義を利用場所のあとに書くことができ、この方法であればエラーは発生しません。
def main():
function_a() #関数の使用
def function_a(): #関数の定義
...
if __name__ == "__main__":
main()
メリット2: ざっくりとした流れをmain関数で表現できる
以下のように、プログラム全体の大まかな流れを、main関数だけで確認することができ、見通しがよくなります。
def main():
# ここを読めば、データの読み込み → 処理 → 結果の保存 をしていることはわかる
data = load_data()
result = process_data(data)
result2 = process_data_2(result)
print_data(result2)
def load_data():
...
def process_data(data):
...
def process_data_2(result):
...
def print_data(result2):
...
if __name__ == "__main__":
main()
まとめ
規模の小さいプログラムであれば、main関数がなくても問題はありません。
しかし、ある程度プログラムの規模が大きくなってくると、どこが実質的なプログラムの開始位置なのか分かりにくくなってきます。
また、上記にあげたメリットもあるので、main関数の定義は必要となります。
そして、ある規模の規模の開発に早い段階から慣れるために、どんなに小さなプログラムでもmain関数を定義するクセをつけることが大切です。
ですので、課題の条件にmain関数の定義が入っているのだと理解しました。
参考にさせていただいたサイト
Discussion