2011-10-26 4 views
24

GoogleはPythonのチュートリアルを持っており、彼らは「不幸」として定型的なコードを記述して、この例を提供します。Pythonの "Boilerplate"コードですか?

#!/usr/bin/python 

# import modules used here -- sys is a very standard one 
import sys 

# Gather our code in a main() function 
def main(): 
    print 'Hello there', sys.argv[1] 
    # Command line args are in sys.argv[1], sys.argv[2] .. 
    # sys.argv[0] is the script name itself and can be ignored 

# Standard boilerplate to call the main() function to begin 
# the program. 
if __name__ == '__main__': 
    main() 

、私は何度も何度も現れる「一見反復コードとして記述されている定型的なコードを聞きましたはるかに簡単であるように見える結果を得るために」(example)。

とにかく、Pythonであった上記の例の "定型" コードと見なさ一部:次のように

if __name__ == '__main__': 
    main() 

は今、私の質問は以下のとおりです。

1)のように(Pythonで定型的なコードをい提供された例)は、私が提供した定義と同じ定義をとっていますか?もしそうなら、なぜですか?

2)このコードは必要ですか?主な方法があるかどうかにかかわらず、コードが実行されるように思えます。このコードをより良く使うには?それはさらに良いですか?

3)なぜ私たちはそのコードを使用し、どのサービスを提供しますか?

4)これはPython全体で発生しますか? 「定型コード」の他の例はありますか?

ああ、話題にならない質問:import sys Pythonでコマンドライン引数を使用する必要がありますか?このような議論が存在しなければ、それはどのように扱われますか?

+4

あなたがそれをインポートするかどうかにかかわらず、 'sys'が存在します。そうでない場合は、コード内で使用することはできません。 –

+0

この特定の定型コードについてのコメントですが、これはユーザ/環境固有のpythonバージョンを取得するため、 '!#/ usr/bin/python'の代わりに常に'#!/ usr/bin/env python'を使用するべきです。これは、ユーザがPythonを他のものと呼ぶか、/ bin以外の場所にインストールすることが可能であるため、これらの事柄のいずれも真ではありません。しかし、これに由来するエラーを処理した人として、私はあなたには非常にイライラしていると伝えることができます。パスのハードコーディングと相対パスの違いのようなものです。 – guribe94

+0

たとえばPython 2と3の定型文は、[python-boilerplate.com](https://www.python-boilerplate.com) –

答えて

17
  1. コマンドラインから実行するスクリプトごとに繰り返されるという意味で繰り返されます。
  2. メインコードをこのような関数に入れると、モジュールを実行せずにインポートできます。これは時に便利です。それは物事をもう少し整理しておく。
  3. 私が言うことができる限り#2と同じです。
  4. Pythonは概して定型表現を避けるのにかなり良いです。ほとんどの状況で、定型コードを記述するのではなく、定型文を作成するコードを書くことができるほど柔軟です。トピック質問オフ

あなたは引数をチェックするコードを記述していない場合は、それらは無視されます。

2

"メインの場合"チェックを使用する理由は、トップレベルにコードの一部を実行するモジュールを持たせることができます(定数、関数、クラスを作成するためにエクスポートします)スクリプトとして実行された場合のみ(例えば、機能の単体テスト)。

後者のコードを関数にラップする理由は、main()ブロックのローカル変数がモジュールのスコープにリークするためです。

スクリプトとして実行されるファイルが、__main__()という名前の関数を宣言する必要がありますが、それは新しいマジック関数名を言語に追加することを意味しますが、__name__メカニズムは既にそこ。 (すべてのモジュールに__name__がなければならないため、削除できませんでした。モジュール名の割り当て方法のために、スクリプトとして実行されるモジュールには特別な名前が必要です。)2行の定型句を取り除くために同じことを行う2つのメカニズムを紹介します。アプリケーションごとに通常は2行の定型句があります。 - それだけの価値はありません。

1

1)主定型が一般的であるが、任意の単純が

2)main()定型モジュールの使用の両方スタンドアロンスクリプト、だけを可能にする定型

3)なしで呼び出されないことはできません他のプログラムのライブラリ

4)非常に一般的です。 doctestは別のものです。

ファイトのパイソン達になるための訓練と、論文との幸運! ;-)

6

この場合、if __name__ == "__main__":ブロックが定型文と呼ばれる理由は、他の多くの言語では自動機能であるということです。 JavaやC++では、他の多くのものの中でコードを実行すると、main()メソッドが検索され実行され、そこにない場合でも不平を言うでしょう。 Pythonはあなたのファイルにあるコードを実行するので、main()メソッドを実行するように指示する必要があります。単純な代替方法は、main()メソッドをデフォルト機能を実行することです。

したがって、if __name__ == "__main__":は、短くてもよい一般的なパターンです。

if __name__ == "__main__": 
    print "Hello, Stack Overflow!" 

    for i in range(3): 
    print i 

    exit(0) 

これはうまくいくはずです。私の例はちょっとばかげていますが、そこに好きなものを置くことができます。 Pythonのデザイナーは、main()メソッドを(おそらく存在しないかもしれませんが)自動的に実行するよりも、Pythonが "スクリプト"言語なので、この動作を選択しました。いくつかのコマンドをファイルに直接書き込んで実行し、コマンドを実行することができます。私は個人的にはPythonの方が好きです。なぜなら、初心者にとってはPythonでの起動が容易になるからです.Hello Worldが1行である言語を使用するのは良いことです。

+1

を見てください。直接実行するとテストを実行するモジュールがいくつか見られますが、時には同じ方法を自分で使いました。あなたが開発中に何かを壊さないことを確認するために非常に便利です。もちろん、モジュールとしてインポートされた場合、テストは実行されません。 – kindall

0

のは、あなたがimport sysを呼び出したときに何が起こったかを見るために瞬間を見てみましょう:

  • Pythonは、リストを見て、sysモジュールにもたらすことがargv機能を発見し、それを
を実行します
  • ここで何が起こっていますか?

    他の場所に書かれた関数が、現在のプログラムのスコープ内で特定の操作を実行するために使用されています。このようなプログラミングは、多くの利点があります。それは実際の労働から論理を分離します。

    • main下で定義されたプログラム自体(論理)、及び
    • main
    • 存在するかどうかをチェックコール部:

      今、限り定型に関しては、二つの部分があります

    あなたは、本質的にあなただけのmain(または他の場所)を定義する前に定義されたすべての機能を使用して、mainの下でプログラムを書き、Pythonはを探してみましょう。

    1

    大きなプロジェクトの一部ではないスクリプトのために、if __name__ == '__main__'を追加する必要はありません。詳しい説明はhereを参照してください。ファイルを単独で実行し、それを他のpythonファイルとともにモジュールとして含める場合にのみ必要です。

    あなたが1つのファイルだけを実行したい場合は、あなたがゼロ定型持つことができます。

    print 1 
    

    をして$ python your_file.py

    Adding the shebang line#!/usr/bin/pythonchmod +x print_one.pyはあなたに

    で実行する能力を取得し実行すると、それを実行します

    ./print_one.py

    最後に、# coding: utf-8では、❤をすべての場所に配置したい場合に、ファイルにユニコードを追加することができます。

    関連する問題