2017-01-04 30 views
0

私は次のように最初の関数を定義するコードの書き換え/で働いている:なぜdef main(argv = [__ name__])とif __name__ == "__main__":sys.exit(main(sys.argv))?

def main(argv=[__name__]): 
    ... 
    *rest of code* 
    ... 

で終わるを:

if __name__ == "__main__": 
    sys.exit(main(sys.argv)) 

私はこれが何をやっていることは確認しているという印象の下によスクリプトがコマンドラインから実行されていることを確認してから、Pythonを終了するときに引数を指定してmainという関数を実行します。しかし、関数定義で変数argv[__name__]にプリセットする必要があるのはなぜですか?これは私のコードではないので、私はこの背後にある本来の意図を知らない。しかし、私は、if __name__ == "__main__":行をスポットコマンドラインの実行を確認するのが初めてです。だから、私はこの構文のための明らかな理由がいくつかあります。任意のヘルプ、またはmainの関数定義と引数/コマンドライン対モジュールテストの詳細については、ご理解ください。

+0

'sys.exit()'には何も変わりありません。私たちのナレッジベースには、 '__name__'と' __main__'を比較した習慣についての質問が既にあります。重複するコンポーネントがなくなるように質問を絞り込んでください。間違いなく、事前に回答された質問と回答されていない質問の両方にまたがっていると、それは「あまりにも広すぎる」。 –

+0

...多くの中の1つの例:[なぜ 'def main()'を使うのですか?](http://stackoverflow.com/questions/4041238/why-use-def-main) –

答えて

1

main()の定義では、ファイル末尾のsys.exit()行以外の方法でmain()が呼び出される可能性があります。これは防御プログラミングの例であるかもしれないし、このファイルの他のサポートされている使用を示すかもしれない。

1回のそのような他のサポートの使用がそうのように、別のPythonプログラムからそれを呼び出すことがあるかもしれない

argv=[__name__]については

import your_module 
your_module.main() 
1

、元devが、おそらくないからこの機能を実行するオプションを維持したいですコマンドライン(別のモジュールによって呼び出されます)を提供し、sys.argv[0]をいくつかの機能に使用するため、__name__を提供します。

mainの機能は、Pythonとは関係がありません。ちょっとした規約(Cなどの言語から派生したもの)とは関係ありません。 sys.exit(main(sys.argv))は、main関数を受信したコマンドライン引数とともに実行した製品と同等の終了コードを使用してsys.exit関数をトリガーします。 mainは、おそらく適切な終了コードを返す必要があります(0はOKを示し、他はさまざまな例外を暗示しています)。

+0

Hmmm ...面白いです。元のコードは 'main()'関数で 'sys.arvg [0]'やargvの要素のどれも使用しません。この関数がコマンドラインからではなくモジュールとして実行された場合、main()関数は常にこれをモジュールとして呼び出すスクリプトのコマンドライン引数に固有の引数を使用するようにargvを定義しますか? –

+0

関数が 'argv'を使用しない場合は、それをパラメータとして使用する意味がありません。それ以外の場合は、カスタムパラメータを送信して(またはデフォルトの 'argv'でそれらが存在することを保証することによって)主な機能を制御できます。 – Uriel

0

CLIからスクリプトを実行すると、argv[0]がスクリプトの名前になり、残りの部分はargvがコマンドライン引数になります。だから、main()の残りの部分はargv[0]はいつもに充填されることを期待する。

デフォルト値は、ファイルがインポートされている代わりに、直接実行されたときargv[0]がそれに類似した何かを持っていることを保証することです。この場合、それはモジュールの名前です。

関連する問題