web-dev-qa-db-ja.com

Pythonの「定型」コードですか?

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 sys Pythonでコマンドライン引数を使用するには?存在しない場合、そのような引数をどのように処理しますか?

30
Bhaxy
  1. コマンドラインから実行するスクリプトごとに繰り返されるという意味で、繰り返しです。
  2. このような関数にメインコードを配置すると、モジュールを実行せずにインポートできます。これは便利な場合があります。また、物事をもう少し整理します。
  3. 私の知る限り#2と同じ
  4. Pythonは通常、定型文を避けるのにかなり優れています。ほとんどの状況で、定型コードを作成するのではなく定型コードを生成するコードを作成できるほど柔軟性があります。

トピック外の質問:

引数を確認するコードを作成しない場合、それらは無視されます。

21
Winston Ewert

この場合_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は「スクリプト」言語であるため、Pythonデザイナーはmain()メソッド(存在しないこともあります)の自動実行よりもこの動作を選択しました。そのため、いくつかのコマンドを直接ファイルに書き込んで実行し、コマンドを実行できます。個人的には、Pythonの方が好きです。なぜなら、初心者にとってPythonでの起動が容易になるからです。また、Hello Worldが1行の言語を持っていることは常に素晴らしいことです。

7
andronikus

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

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

print 1

$ python your_file.pyで実行します

シェバン行を追加#!/usr/bin/pythonおよびchmod +x print_one.pyを実行すると、

./print_one.py

最後に、# coding: utf-8を使用すると、❤をあちこちに配置する場合にファイルにUnicodeを追加できます。

2
crizCraig

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

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

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

2
millimoose

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

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

3)ボイラープレートは、スタンドアロンスクリプトとしてモジュールの使用を許可しますand他のプログラムのライブラリとして

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

Python第一人者…そして論文の幸運を祈る!;-)

1
Risto

import sysを呼び出したときに何が起こったかを見てみましょう。

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

それで、ここで何が起こっているのでしょうか?

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

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

  • mainで定義されたプログラム自体(ロジック)、および
  • mainが存在するかどうかを確認する呼び出し部分

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

0
notnarayan