基本的には、スクリプトがそれ自身で直接実行される場合にのみ、セントラルエントリポイントを定義することができます。 __name__
は、それ自身が実行される場合に限り、'__main__'
に等しくなります。スクリプトの実際のコンテンツを別の関数に入れると、他のスクリプトがその関数をインポートしていつでも実行できるので、スクリプトのインポート時にすぐに実行されません。
これは、何かをすばやく必要とするときにデフォルト動作をするために、libaryモジュールでよく使用されます。たとえば、http.server
モジュールは、あなたが考えることができる機能を備えた独自のHTTPサーバーを作成するための幅広い機能を提供します。シンプルなサーバーをすばやく待ち受け、静的にファイルを渡したい場合は、コマンドラインから実行するときにモジュールのデフォルトの動作を使用できます。
python3 -m http.server
をコマンドラインで実行すると、正確に実行されます。 http.server
モジュールを実行します。モジュール自体は、__name__ == '__main__
ブロックで単純なHTTPサーバーを起動します。あなたのコメントを受けて
:ライブラリとして機能し、通常のモジュールについては、
、種類や機能が含まれ、アプリケーションのニーズ、あなたはmain
機能やメインブロックを必要としません。たとえば、実際にアプリケーションを起動する起動スクリプトなど、直接呼び出されるスクリプトの場合、関数やクラスにカプセル化されずに直接実行されるコードがいくつかあります。それは何かになるでしょう、あなたは別のものを呼び出す主な機能を置くことができます。これにより、コードをどこに置くかについて少し自由度が増します。たとえば、main
関数をファイルの先頭に直接置くことができ、その中で呼び出される追加の関数はファイルの中でさらに定義されます。スクリプトの最後の部分はmain()
です。必ずしもそれをif __main__ == '__main__':
の状態に入れる必要はありません。直接呼び出すことができます。だから、例えば、あなたのスクリプトは次のようになります。
def main():
# doing something
utilityFunction(...)
otherUtilityFunction(...)
def utilityFunction (...):
...
def otherUtilityFunction (...):
...
main()
あなたが別の関数にコードを入れていない場合、あなたは(あなたの関数の定義の後に)一番下にしていることをすべての処理を行う必要があるだろうスクリプトが直接呼び出されたときの作業をすばやく確認したい場合は、生産性が低下する可能性があります。
今、私が言ったように、あなたはそれをメイン条件ブロックに入れる必要はありません。あなたはそれを直接呼び出すことができます。しかし、何らかの理由でファイルをインクルードする必要がある場合(例えば、別のものにカプセル化したい場合や、対話型シェル(IDLEなど)から繰り返し呼び出す場合など) main()
を実行するには、モジュールをインポートするだけで、その機能を実際に実行したいときだけです。それで、main()
を条件に入れるべきです。そうすればモジュールを直接実行しない限り実行されません。
一般的に、main()
コールをこのような状態にするのは悪いことではありません。それは決して傷つくことはありませんが、しばしば後で役に立ちます。
なぜ、これらの重複しているすべてのアップノートが表示されますか? – none
この質問は非常に幅広いサブ疑問文を網羅していますので、上記で指摘したその他の質問や詳細についてはお答えしません。 – user836087