私はPythonの初心者ですが、他のOOP言語の経験はあります。私のコースではpythonのmainメソッドについて説明していません。
pythonのmainメソッドがどのように動作するのか教えてください。私はJavaと比較しようとしているので混乱しています。
def main():
# display some lines
if __name__ == "__main__": main()
mainはどのように実行されるのでしょうか、そしてなぜ main
を実行するためにこの奇妙な if
が必要なのでしょうか。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アプローチは、言語(*)にほぼ固有です。
意味論は少し微妙です。 __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__
行の上にあるすべてのコードが実行され、評価されていることを理解することが重要です。 ファイルがインポートされたとき、またはファイルが実行されたときに、インタープリターによって評価されます。 if __name__
行の前に print
ステートメントを配置すると、他のコードがモジュールとしてインポートしようとするたびに出力が印刷されます。 (もちろん、これは反社会的です。 それをしないでください)。
私は個人的に、これらのセマンティクスが好きです。 プログラマーが機能(定義)を機能(実行)から分離することを奨励し、再利用を促進します。
理想的には、ほとんどすべてのPythonモジュールは、コマンドラインから呼び出された場合に役立つ何かを実行できます。 多くの場合、これはユニットテストの管理に使用されます。 特定のファイルがシステムの他のコンポーネントのコンテキストでのみ役立つ機能を定義している場合でも、 __name__ == "__main__"
を使用して、このモジュールに適用される一連のユニットテストを呼び出すコードのブロックを分離できます。 。
(そのような機能やユニットテストを使用しない場合は、ファイルモードが実行可能でないことを確認するのが最善です)。
概要: if __name__ == '__main__':
には2つの主要な使用例があります。
-モジュールが他のコードにインポートするための機能を提供できるようにすると同時に、スタンドアロンスクリプト(機能の周りのコマンドラインラッパー)として有用なセマンティクスを提供します。 -モジュールが、テストするコード(と同じファイル)とともに格納され、残りのコードベースとは独立して実行できる一連のユニットテストを定義できるようにします。
これは「def main( args)」にかなり一般的であり、「if name = 'main:」がある場合、メインを次のように定義する場合は、単に「main( sys.argv [1:])」を呼び出します。他のいくつかのプログラミング言語に類似しています。 .pyファイルが主に他のコードのモジュールとして使用されることを意図している場合は、 def test_module()
を呼び出し、__name__ == '__main__:'
スイートでtest_module()
を呼び出すことができます。
*(Rubyは同様の機能 if __file__ == $ 0
も実装しています)。
Pythonでは、実行はmainから始まる必要はありません。実行コードの最初の行が最初に実行されます; の最初の行が最初に実行されます。
def main():
print("main code")
def meth1():
print("meth1")
meth1()
if __name__ == "__main__":main() ## with if
**出力
meth1
main code
main() の詳細 - http://ibiblio.org/g2swap/byteofpython/read/module-name.html
モジュールの __name__
を指定します。
すべてのモジュールには名前があり、モジュール内のステートメントはそのモジュールの名前を知ることができます。これはある特殊な状況で特に便利です - 前述のように、モジュールが初めてインポートされると、そのモジュールのメインブロックが実行されます。もし、プログラムが他のモジュールからインポートされたときではなく、自分自身で使用されたときだけブロックを実行したい場合はどうすればいいでしょうか?これは、モジュールのname属性を使うことで実現できる。
モジュールのnameを使用する。
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
**出力
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
どのように動作するか -
すべての Python モジュールには __name__
が定義されており、これが __main__
である場合、そのモジュールはユーザーによってスタンドアロンで実行されていることを意味し、適切なアクションを実行することができます。
Pythonには、JavaやC、C++などのように定義されたエントリーポイントはありません。むしろ、単にソースファイルを一行ずつ実行します。ifステートメントを使うと
main` 関数を作成することができ、ファイルが他のモジュールのライブラリとしてではなく、"Main" モジュールとしてロードされた場合に実行されます。
これは Python インタプリタがファイルの最初の行から実行することを意味します。class Foobar:や
def foobar()` のような行を実行すると、クラスか関数が生成され、後で使用するためにメモリに保存されます。
今作成しているモジュール(.py)ファイルを他のpythonスクリプトからインポートしても、その中のコードは実行されません。
if __name__ == '__main__':
...
コンソールから直接スクリプトを実行すると、実行されます。
Python は main() 関数を使用しませんし、必要としません。そのガードで保護されていないコードは、モジュールの実行 または インポート時に実行されます。
これは python.berkely.edu でもう少し詳しく説明されています。