Pythonのif __name__ == '__main__'
の必要性がよく分かりません。ググると、https://teratail.com/questions/71845 がヒットするんですが、
「直接実行をサポートしつつ、他モジュールからimportして任意のタイミングで使えるようにしたいと思う」局面の具体例が思いつきません。どのような場合なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
身近な例だと、以下のようなケースで役に立ちます。
何かを書いていて「ここから先は別ファイルに分けよう」と思い立つことはままあります。たとえばA.pyでデータを取得してきて適当なフォーマットに変換して保存する、B.pyでそのデータを読んで処理したり分析したりする、といったケースです。
で、それを実行したとして、「しまった、前のファイルで定義した○○が要るんだった」と思うことが珍しくはありません。上の例だと、B.pyでA.pyに定義されているものを読まないといけないケースですね。
コピペするのは最低の選択です(両方管理しないといけない。書き換えたくなったらどうするのか)。素直にimport
するとA.pyがまるごと実行されてしまいます。
一番まっとうなのは、共通で参照する定義をまとめたファイルを別途作ることですが、なんだか大げさになってきて似つかわしくないという場合もあると思います。そういうとき、A.pyの実際の処理の実行部分がすべてif __name__ == "__main__":
のブロックから起動するようにしておけば、副作用なくA.pyで定義したものを読み込める・・・という訳です。
投稿2019/04/15 06:51
総合スコア30935
0
例えば、標準ライブラリのpickleは直接呼び出すことができます。
- ライブラリとしては、オブジェクトのシリアライズ/デシリアライズ(バイナリ化)ができます。
- メインモジュールとして起動した場合、pklファイルの中身を表示してくれます。
C:...>python Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 18:50:55) [MSC v.1915 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pickle >>> >>> obj = {1: 1, 2: 4, 3: 9, 4: 16} >>> >>> with open('obj.pkl', mode='wb') as fout: ... pickle.dump(obj, fout) ... >>> >>> exit() C:...>type obj.pkl }q (KKKKKK KKu. C:...>python -m pickle obj.pkl {1: 1, 2: 4, 3: 9, 4: 16}
上記の実行結果の読み方:
0. 実際にpklファイルを作っている。
0. 試しに出力してみるが、バイナリ形式なので正常に読み込めない。
0. pickleを利用すると閲覧することができる。
投稿2019/04/15 05:59
編集2019/04/15 06:02総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
引用メインの回答ですが「直接実行の場合のみユニットテストやデモ動作させたい」といった局面でしょうか。
Python - if name == 'main': の意味
たとえば、
「モジュールを作っているとき、かんたんにテストしたい(値をprintするなどで確認する)コードを書くとき」
これは、他のモジュールにインポートされた時には表示する必要がなかったりする。
そういう時は、テストするためのコードを「if name == 'main':」の中にかけば、 トップレベルファイルで実行された時にのみ、テスト用の値出力処理が行われるようにすることができる。
他のモジュールからインポートされた時は False となり、実行されない。ちょっと便利。
What does if name == “main”: do?
Your module is a library, but you want to have a script mode where it runs some unit tests or a demo.
投稿2019/04/15 05:54
総合スコア38341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/15 10:25