2024年2月27日火曜日

Pythonでmain関数作ってる人は何がしたいんですか?

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を書くのはソースの末尾に

  1. if __name__ == "__main__": 
  2. main() 

を書きたいからですね。これで単品で使うこともできるし、importして使うこともできます。
単品の書き捨てのつもりでも、役に立つものになってきたらモジュールにしたくなるでしょう?
こういうクセを付けているのです。

 · 
フォロー

こんなの、ですよね?

  1. def main(): 
  2. pass 
  3.  
  4. if __name__ == '__main__': 
  5. main()  

このモジュールを指定して実行したときの動作を定義したいのだと思います。別の見方をすると、このモジュールに定義されているものを他のモジュールから import したときにも使えるように整理しておこう、という意図があると思います。

それならば「if __name__ == '__main__': とした後のブロックに main の内容を全部書けば良いじゃん?」となるのもしれないですが、 main を用意した方が分かりやすいと思います。

本来の用途としてはこのモジュールに main が必要ではなくても、このモジュールにあるコードのテストを行う関数を用意しておいてそれらを main から呼び出す、というのはよくある用途のひとつかなと思います。

 · 
フォロー

私は Python を殆ど触っていないので、Python 事情はよく分かりません。しかし main 関数はコンパイラー言語では実行ファイルを実行した時の入口点として必要になります。スクリプト系の言語の場合で main 関数を必須としている言語を知りません(単に勉強不足なだけです)。とは言え私も Javascript をノードで動かすときには main 関数をよく作ります。つい先ほども Repl で動作させるのに main 関数と作って >main() と実行させて結果確認をしていました。想像ですが、他の言語の慣習が身についていて無意識というかわかっていてもお尻の座り心地が良いからなのではないでしょうか。

 · 
フォロー

公式ドキュメントにも説明ありますよ。

コマンドラインツールのエントリーをmain関数に書くこと多いと思います。

ChatGPTに例を書いてもらいました。動作チェックしてませんが例としてはいいと思います。 モジュールとしてもコマンドラインツールとしても使えますね。

  1. # yaml2json.py 
  2. import sys 
  3. import yaml 
  4. import json 
  5.  
  6. def convert_yaml_to_json(yaml_file, json_file): 
  7. # yamlファイルを読み込む 
  8. with open(yaml_file, "r", encoding="utf-8") as f: 
  9. data = yaml.safe_load(f) 
  10. # jsonファイルに書き込む 
  11. with open(json_file, "w", encoding="utf-8") as f: 
  12. json.dump(data, f, ensure_ascii=False, indent=4) 
  13.  
  14. def main(): 
  15. # コマンドライン引数をチェックする 
  16. if len(sys.argv) != 3: 
  17. print("Usage: python yaml2json.py <input.yaml> <output.json>") 
  18. sys.exit(1) 
  19. # 入力ファイルと出力ファイルを取得する 
  20. input_file = sys.argv[1] 
  21. output_file = sys.argv[2] 
  22. # yamlファイルをjsonに変換する 
  23. convert_yaml_to_json(input_file, output_file) 
  24. print(f"Converted {input_file} to {output_file}") 
  25.  
  26. # このスクリプトが直接実行された場合はmain関数を呼び出す 
  27. if __name__ == "__main__": 
  28. main() 

Pythonはシェルスクリプト代替の小さなツールから、大型プロジェクトまで使われていますが、こういった細部の言語仕様の使いやすさがあるからこれだけ人気になったのかなと思います。

__main__ --- トップレベルのスクリプト環境
Python では、__main__ という特別な名前が次の二つの重要な用途で使われます: プログラムのトップレベル環境の名前。__name__ == '__main__' という式でチェックすることができる。, Python パッケージにおける__main__.py ファイル。. どちらも Python のモジュールに関わる機能です。 1つ目はユーザーがどうモジュールを使うか、2つ目はモジ...

0 コメント:

コメントを投稿