[解決済み] Pythonのmainメソッドを理解する【重複】について
質問
私は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
).
関連
-
ピロウズ画像色処理の具体的な活用方法
-
Python関数の高度な応用を解説
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] スライス表記を理解する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonによるjieba分割ライブラリ
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
Python 入出力と高次代入の基礎知識
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?