Pythonコードの"if __name__=='__main__':"の意味に関する個人メモ

備忘録です。

nameの条件分岐の意味をちゃんと理解していなかったので。他人に何かを教えるときにはちゃんと理解した上で説明すべきだし、公開しとくと尚良いです。

Pythonのコードを読んでいると、以下の条件分岐がコードの最終行近くに書いてあるのを見かけるかと思います。

def ConfNameSample():
    print('これは__name__確認用のサンプルコードです')
if __name__ == '__main__':
    ConfNameSample()

↑のif以降の部分

これはスクリプトとして実行された場合のみ、関数の中身を実行するという条件を表しています。言い換えると、トップレベルファイルとして実行した場合のみConfNameSampleが実行されます。

トップレベルファイルとして実行された場合、nameにはmainが代入されます。一方で、モジュールとしてインポートされた場合には、nameにはファイル名が代入されます。

分かりにくいので補足

例えば、以下の様なPythonスクリプトを作成します。名前は適当で良いですが、今回はsample.pyとしました。defで定義した関数の二行目でnameに何が入っているか確認できるようになっています。

def WhatIsName():
    print('__name__の中身を確認するよ!')
    print(__name__)
if __name__ =='__main__':
    WhatIsName()

これをどっかのフォルダに入れておいて、コマンドプロンプトやコンソールから実行してみます。すると以下の様な出力が得られるはずです。

f:id:kazutaka83:20160828124747p:plain

スクリプト(トップレベルファイル)として実行するとnameの中身はmainになっています。じゃあモジュールとして読み込んだらどうなってるのかも確認してみましょう。

さっきのやつをちょっと修正して

def WhatIsName():
    print('モジュールとしてインポートしたときの__name__の中身は')
    print(__name__)

コマンドプロンプトからPythonの対話シェルに入ってインポートします。モジュールと関数を呼び出すとこんな感じ。

f:id:kazutaka83:20160828130240p:plain

実行スクリプトが事故を起こさないようにするために、ちゃんと記しておいたほうがいいですね。


スポンサード リンク