https://jp.quora.com/Python%E3%81%A7main%E9%96%A2%E6%95%B0%E4%BD%9C%E3%81%A3%E3%81%A6%E3%82%8B%E4%BA%BA%E3%81%AF%E4%BD%95%E3%81%8C%E3%81%97%E3%81%9F%E3%81%84%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B
ぷろぐらみんぐ…w
とか煽って終わるのもアレですね。mainを書くのはソースの末尾に
- if __name__ == "__main__":
- main()
を書きたいからですね。これで単品で使うこともできるし、importして使うこともできます。
単品の書き捨てのつもりでも、役に立つものになってきたらモジュールにしたくなるでしょう?
こういうクセを付けているのです。
こんなの、ですよね?
- def main():
- pass
- if __name__ == '__main__':
- main()
このモジュールを指定して実行したときの動作を定義したいのだと思います。別の見方をすると、このモジュールに定義されているものを他のモジュールから import したときにも使えるように整理しておこう、という意図があると思います。
それならば「if __name__ == '__main__': とした後のブロックに main の内容を全部書けば良いじゃん?」となるのもしれないですが、 main を用意した方が分かりやすいと思います。
本来の用途としてはこのモジュールに main が必要ではなくても、このモジュールにあるコードのテストを行う関数を用意しておいてそれらを main から呼び出す、というのはよくある用途のひとつかなと思います。
私は Python を殆ど触っていないので、Python 事情はよく分かりません。しかし main 関数はコンパイラー言語では実行ファイルを実行した時の入口点として必要になります。スクリプト系の言語の場合で main 関数を必須としている言語を知りません(単に勉強不足なだけです)。とは言え私も Javascript をノードで動かすときには main 関数をよく作ります。つい先ほども Repl で動作させるのに main 関数と作って >main() と実行させて結果確認をしていました。想像ですが、他の言語の慣習が身についていて無意識というかわかっていてもお尻の座り心地が良いからなのではないでしょうか。
公式ドキュメントにも説明ありますよ。
コマンドラインツールのエントリーをmain関数に書くこと多いと思います。
ChatGPTに例を書いてもらいました。動作チェックしてませんが例としてはいいと思います。 モジュールとしてもコマンドラインツールとしても使えますね。
- # yaml2json.py
- import sys
- import yaml
- import json
- def convert_yaml_to_json(yaml_file, json_file):
- # yamlファイルを読み込む
- with open(yaml_file, "r", encoding="utf-8") as f:
- data = yaml.safe_load(f)
- # jsonファイルに書き込む
- with open(json_file, "w", encoding="utf-8") as f:
- json.dump(data, f, ensure_ascii=False, indent=4)
- def main():
- # コマンドライン引数をチェックする
- if len(sys.argv) != 3:
- print("Usage: python yaml2json.py <input.yaml> <output.json>")
- sys.exit(1)
- # 入力ファイルと出力ファイルを取得する
- input_file = sys.argv[1]
- output_file = sys.argv[2]
- # yamlファイルをjsonに変換する
- convert_yaml_to_json(input_file, output_file)
- print(f"Converted {input_file} to {output_file}")
- # このスクリプトが直接実行された場合はmain関数を呼び出す
- if __name__ == "__main__":
- main()
Pythonはシェルスクリプト代替の小さなツールから、大型プロジェクトまで使われていますが、こういった細部の言語仕様の使いやすさがあるからこれだけ人気になったのかなと思います。
0 コメント:
コメントを投稿