2011-11-22 9 views
8

可能性の重複:
What does <if name==“main”:> do?`if name ==" __main __ "`はPythonで何を意味しますか?

私は今、かなり長い間Pythonでスクリプトを書いていると私はそれを必要とするように私は、Pythonのより多くを学びます。他の人のコードを読むときには、私はif name == "__main__":という構造を頻繁に満たす。

何が良いですか?

+1

ああ、なるほど '場合__name __ =「__ __メイン」:'チェックはスクリプトは、スタンドアロンまたはモジュールで枯れます。 – Adobe

+1

コピーパターや混乱を避けるために、前のコメントのタイプミスに気をつけてください: 'if __name __ ==" __ main __ ":' – alberto

答えて

20

これにより、同じファイルをライブラリとして(インポートすることによって)、またはアプリケーションの開始点として使用できます。

# hello.py 
def hello(to=__name__): 
    return "hello, %s" % to 

if __name__ == "__main__": 
    print hello("world") 

は、次の2つの方法でそのコードを使用することができます。

はたとえば、以下のファイルを検討します。 1つは、それをインポートするプログラムを書くことができます。あなたはライブラリをインポートする場合、__name__は、ライブラリの名前になりますので、チェックが失敗し、コードは(必要な動作である)実行されません。

#program.py 
from hello import hello # this won't cause anything to print 
print hello("world") 

あなたは書きたくない場合すべてのpythonライブラリをインポートしたりで直接実行されるかどうかに基づいて設定されます特殊変数__name__に依存して、この動作

$ python hello.py 
hello, __main__ 

:あなたは直接のようなもので、コマンドラインからコードを実行することができ、この第二のファイル、通訳。直接実行すると、__main__に設定されます。インポートされた場合、ライブラリ名に設定されます(この場合はhello)。

多くの場合、この構造体はユニットテストをコードに追加するために使用されます。この方法では、ライブラリを書くときに、ライブラリが通常の方法で使用されたときに実行されることを心配することなく、テストコードをファイルに埋め込むことができます。ライブラリをテストする場合は、ライブラリをプログラムのように実行するだけで済みますので、フレームワークは必要ありません。

も参照してください__main__ in the python documentation(それは非常にまばらなのですが)

3

基本的には、

別の方法でインポートまたは参照された「メイン」スクリプトファイルと外部ファイルの区別があります。スクリプトが「メイン」スクリプトの場合、特殊変数__name__"__main__"に等しくなります。

このコードを使用すると、スクリプトに含まれるクラスと変数から "実行"コードを保護できます。これにより、スクリプトをインポートして、そのスクリプトのメインコードがあれば実際に実行することなく、クラスと変数を使用することができます。

+0

ボーナストリビア:モジュールをインポートすると__name__の中には何がありますか?それは "__main__"と呼ばれることがありますか? – Agrajag

関連する問題