1. ホーム
  2. python

[解決済み] Pythonのmainメソッドを理解する【重複】について

2022-04-26 15:02:39

質問

私はPythonの初心者ですが、他のOOP言語での経験があります。私のコースでは、Pythonのmainメソッドを説明していません。

Pythonでmainメソッドがどのように動作するか教えてください。私はJavaと比較しようとしているので、混乱しています。

def main():
# display some lines

if __name__ == "__main__": main()

mainはどのように実行され、なぜこのような奇妙なことが必要なのか? if を実行するために main . を削除すると、私のコードは出力されずに終了します。 if .

最小限のコード

class AnimalActions:
    def quack(self): return self.strings['quack']
    def bark(self): return self.strings['bark']

class Duck(AnimalActions):
    strings = dict(
        quack = "Quaaaaak!",
        bark = "The duck cannot bark.",
    )


class Dog(AnimalActions):
    strings = dict(
        quack = "The dog cannot quack.",
        bark = "Arf!",
    )

def in_the_doghouse(dog):
    print(dog.bark())

def in_the_forest(duck):
    print(duck.quack())

def main():
    donald = Duck()
    fido = Dog()

    print("- In the forest:")
    for o in ( donald, fido ):
        in_the_forest(o)

    print("- In the doghouse:")
    for o in ( donald, fido ):
        in_the_doghouse(o)

if __name__ == "__main__": main()

解決方法は?

Pythonの"main"の考え方は、ほぼこの言語独自のものです(*)。

セマンティクスは少し微妙です。 その __name__ 識別子は、インポートされるモジュールの名前に束縛されます。 しかし、ファイルが実行されるときには __name__ が設定されます。 "__main__" (リテラル文字列の __main__ ).

これは、ほとんどの場合、実行されるべきコードの部分と、機能を定義するコードの部分とを分けるために使われます。 そのため、Pythonのコードにはしばしば次のような行が含まれます。

#!/usr/bin/env python
from __future__ import print_function
import this, that, other, stuff
class SomeObject(object):
    pass

def some_function(*args,**kwargs):
    pass

if __name__ == '__main__':
    print("This only executes when %s is executed rather than imported" % __file__)

この規約により、あるファイルに他のプログラムで使用するクラスや関数を定義し、さらにそのファイルがスタンドアローンのスクリプトとして呼ばれたときのみ評価されるコードを含めることができるようになります。

ここで重要なのは、このように if __name__ の行は、どちらの場合でも実行、評価されています。 ファイルがインポートされたとき、または実行されたときにインタプリタによって評価されます。 もしあなたが print 文の前に if __name__ という行があると、他のコードがそれをモジュールとしてインポートしようとするたびに、出力が表示されます。 (もちろん、これは 反社会的 . そんなことしないでください)。

私自身は、このようなセマンティクスが好きです。 プログラマーが機能(定義)と機能(実行)を分離することを促し、再利用を促進します。

理想を言えば、ほとんどすべてのPythonモジュールは、コマンドラインから呼び出されたら何か役に立つことができる。 多くの場合、これはユニットテストを管理するために使用されます。 もし特定のファイルが、システムの他のコンポーネントのコンテキストにおいてのみ有用な機能を定義している場合、そのファイルに対して __name__ == "__main__" を使用して、このモジュールに適用されるユニットテストのスイートを呼び出すコードのブロックを分離します。

(そのような機能やユニットテストを持たないのであれば、ファイルモードが実行可能でないことを保証することが最善です)。

概要を説明します。 if __name__ == '__main__': には2つの主な使用例があります。

  • モジュールが他のコードにインポートするための機能を提供しながら、スタンドアローンスクリプト(機能のコマンドラインラッパー)としても有用なセマンティクスを提供できるようにすること。
  • テストされるコードと一緒に (同じファイルに) 保存され、コードベースの残りの部分から独立して実行できるユニットテストのスイートを定義できるようにするモジュールです。

よくあるのが def main(*args) を持ち if __name__ == '__main__': を呼び出すだけです。 main(*sys.argv[1:]) 他のプログラミング言語と同じような方法でmainを定義したい場合。 もしあなたの.pyファイルが、主に他のコードのモジュールとして使用されることを意図しているならば、あなたは def test_module() を呼び出し test_module() の中で if __name__ == '__main__:' スイートを作成します。

  • (Rubyも同様の機能を実装しています if __file__ == $0 ).