Pythonの__name__と__main__について

0

Pythonのコードを見ているとよく見かける__name__と__main__

このコードの意味やどういった時に使うのかについて紹介していきます。

 

Pythonの__name__や__main__について

まず実際にコードを書いてみましょう。test.pyというファイルを準備し、シンプルに__name__を出力してみます。

__main__が出力されましたね。これは、Pythonのスクリプトを直接実行した時には、__name__の中に自動で__main__が代入されるからです。

 

それでは次にtest1.pyという別ファイルを作ってみましょう。コードの中身はtest.pyと同じようにします。

ファイル名が違うだけでコードの中身は一緒なので、実行した場合の出力結果は__main__ですね。

 

では、次にtest.pyからtest1.pyをimportしてみましょう。つまり、test1.pyを直接実行しない方法を試してみます。

Pythonではimportと記述することで別のプログラムを呼び出すことができます。これはモジュールと呼ばれます。

先ほどとは少し、結果が異なりましたね。

print(__name__)の結果は__main__と同じですが、test1.pyをインポートして出力した結果がtest1になっていますね。

ここまで来るとお気付きの人もいるのではないでしょうか?

test1.pyは今回、直接実行されたスクリプトではありませんね。このような場合に__name__を出力すると、__main__と出力されずにそのファイル名を返します。

 

どのような時に使うのか?

こういった機能はどのような場面で使われるのでしょうか?

個人開発で一人で作業をしている場合は、さほど必要性を感じませんが大規模な複数人が関わるような開発の場合にこの機能が使われます。(というか、必ず使われます)

 

複数人が開発に携わった場合に、誰がどこからモジュールをimportしてくるか不明瞭になってしまうケースがあります。

そういった時に、importされた場合に実行されてほしくないコード(テストコードなど)に記載します。

今度は、test1.pyをimportしてhelloと表示するメソッドだけを使いたいとします。

test1.pyをインポートして、helloメソッドを呼び出しているので出力結果はhelloとなりそうですが・・・

testが先に出力されていますね。これはtest1.pyに記載されていたprint(‘test’)の部分です。

今回は、ただtestと出力するだけのコードですが、これが単純ではないコードを記載していればバグに繋がりますね。

test1.pyのメソッドをインポートしただけなのに、他のスクリプトが実行されてしまっていますね。

ここで登場するのが本題でもある__name__と__main__です。

 

他のモジュールをインポートしたい、しかし他の人が読み込んだ時に実行されたくないコードがある。

 

このような場合、test1.pyをこのように書きます。

このif __name__ == ‘__main__’の記載を見たことがある人も多いのではないでしょうか?

これは、このファイルが直接実行されない限り、以下のスクリプトを実行しないと同義です。

つまり、他で呼び出された場合に実行されたくないテスコードなどをこのように記載します。

test.pyを実行してみます。先ほどは誤ってprint(‘test’)まで実行されていましたがどうでしょうか。

 

今度はprint(‘test’)のコードは読み込まれていませんね。

 

このようにモジュールをインポートする際に、実行されてほしくないコードなどはこのように記載します。

Pythonの参考書は一人で勉強することが前提となっているため、こうした記述をしていない書籍もありますが実際の開発の現場ではよく使われる記述なので覚えておきましょう。









 

About Author

Comments are closed.