37

Google には Python チュートリアルがあり、ボイラープレート コードを「不運」と表現し、次の例を提供しています。

#!/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) このコードは必要ですか? main メソッドがあるかどうかに関係なく、コードが実行されるように思えます。このコードをより使いやすくするにはどうすればよいですか? それはさらに良いですか?

3) なぜそのコードを使用し、どのようなサービスを提供するのですか?

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

ああ、トピック外の質問: import sysPython でコマンド ライン引数を使用する必要がありますか? そこにない場合、そのような引数をどのように処理しますか?

4

7 に答える 7

25
  1. これは、コマンド ラインから実行するスクリプトごとに繰り返されるという意味で反復的です。
  2. このようにメインコードを関数に入れると、モジュールを実行せずにインポートできます。これは時々役に立ちます。また、物事をもう少し整理します。
  3. 私が知る限り、#2と同じです
  4. 一般に、Python はボイラープレートを回避するのに非常に優れています。十分な柔軟性があるため、ほとんどの場合、ボイラープレート コードを記述するのではなく、ボイラープレートを作成するためのコードを記述できます。

トピック外の質問:

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

于 2011-10-26T02:18:39.583 に答える
8

この場合、ブロックがボイラープレートと呼ばれる理由は、if __name__ == "__main__":他の多くの言語で自動化されている機能を複製するためです。Java や C++ などでは、コードを実行するとメソッドが検索されてmain()実行され、メソッドが存在しない場合はエラーが表示されます。Python はファイル内のすべてのコードを実行するため、main()メソッドを実行するように Python に指示する必要があります。簡単な代替手段は、main()メソッドの実行をデフォルトの機能にすることです。

だから、if __name__ == "__main__":もっと短くなる可能性がある一般的なパターンです。次のような別のことができない理由はありません。

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

  for i in range(3):
    print i

  exit(0)

これは問題なく機能します。私の例は少しばかげていますが、好きなものをそこに置くことができることがわかります。main()Python の設計者は、おそらく Python が「スクリプト」言語であるため、メソッドを自動的に実行するよりもこの動作を選択しました(存在しない可能性があります)。そのため、いくつかのコマンドをファイルに直接書き込んで実行すると、コマンドが実行されます。私は個人的に Python の方が好きです。なぜなら、Python で初心者が簡単に起動できるからです。また、Hello World が 1 行である言語を使用することは常に素晴らしいことです。

于 2011-10-26T05:03:42.410 に答える
3

「if main」チェックを使用する理由は、コードの一部をトップレベルで実行するモジュール (定数、関数、またはクラスなど、エクスポートするものを作成するため) と、次のように実行された場合にのみ一部を実行するモジュールを作成できるようにするためです。スクリプト (機能の単体テストなど)。

後者のコードを関数でラップする必要があるのは、main()ブロックのローカル変数がモジュールのスコープに漏れるからです。

別の設計として、スクリプトとして実行されるファイルで、たとえば という名前の関数を宣言する必要がありますが、これは、メカニズムが既に存在する__main__()間に、新しい魔法の関数名を言語に追加することを意味します。(また、すべてのモジュールには が必要であり、モジュール名の割り当て方法により、スクリプトとして実行されるモジュールには「特別な」名前が必要な__name__ため、削除できませんでした。) 同じことを行う 2 つのメカニズムを導入するだけで__name__2 行のボイラープレート (通常はアプリケーションごとに 2 行のボイラープレート) を削除する価値はないようです。

于 2011-10-26T02:46:01.857 に答える
2

if __name__ == '__main__'大規模なプロジェクトの一部になることを意図していない 1 回限りのスクリプトを追加する必要はありません。すばらしい説明については、こちらを参照してください。ファイルを単独で実行し、他の python ファイルと一緒にモジュールとして含める場合にのみ必要です。

1 つのファイルだけを実行したい場合は、ボイラープレートをゼロにすることができます。

print 1

そしてそれを実行します$ python your_file.py

シバンラインを追加し #!/usr/bin/pythonて実行chmod +x print_one.pyすると、実行できるようになります

./print_one.py

最後に、# coding: utf-8❤ をいたるところに配置したい場合は、Unicode をファイルに追加できます。

于 2014-07-17T05:24:06.530 に答える
1

1) メインボイラープレートは一般的ですが、これ以上単純にすることはできません

2)main()ボイラープレートなしでは呼び出されません

3) ボイラープレートにより、モジュールをスタンドアロン スクリプトとして、および他のプログラムのライブラリとして使用できます。

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

Python の第一人者になるためのトレーニングを行います…そして卒業論文で頑張ってください! ;-)

于 2011-10-26T04:43:09.217 に答える
0

あなたが電話したときに何が起こったのか見てみましょうimport sys

  • Pythonはリストを調べて、sysモジュールを取り込みます
  • argv関数を見つけて実行します

それで、ここで何が起こっているのですか?

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

さて、ボイラープレートに関する限り、2つの部分があります。

  • プログラム自体(ロジック)、、、mainおよび
  • main存在するかどうかをチェックする呼び出し部分

main基本的に、定義する直前(または他の場所)に定義したすべての関数を使用して、の下にプログラムを記述しmain、Pythonにを検索させますmain

于 2011-11-03T18:20:16.980 に答える