Pythonの__name__と__main__について
Pythonのコードを見ているとよく見かける__name__と__main__
このコードの意味やどういった時に使うのかについて紹介していきます。
Pythonの__name__や__main__について
まず実際にコードを書いてみましょう。test.pyというファイルを準備し、シンプルに__name__を出力してみます。
print(__name__)
__main__
__main__が出力されましたね。これは、Pythonのスクリプトを直接実行した時には、__name__の中に自動で__main__が代入されるからです。
それでは次にtest1.pyという別ファイルを作ってみましょう。コードの中身はtest.pyと同じようにします。
ファイル名が違うだけでコードの中身は一緒なので、実行した場合の出力結果は__main__ですね。
__main__
では、次にtest.pyからtest1.pyをimportしてみましょう。
つまり、test1.pyを直接実行しない方法を試してみます。
Pythonではimportと記述することで別のプログラムを呼び出すことができます。これはモジュールと呼ばれます。
import test1
print(__name__)
test1
先ほどとは少し、結果が異なりましたね。
test1.pyをインポートして出力した結果がtest1になっていますね。
ここまで来るとお気付きの人もいるのではないでしょうか?
test1.pyは今回、直接実行されたスクリプトではありませんね。
このような場合に__name__を出力すると、__main__と出力されずにそのファイル名を返します。
どのような時に使うのか?
こういった機能はどのような場面で使われるのでしょうか?
個人開発で一人で作業をしている場合は、さほど必要性を感じませんが大規模な複数人が関わるような開発の場合にこの機能が使われます。(というか、必ず使われます)
複数人が開発に携わった場合に、誰がどこからモジュールをimportしてくるか不明瞭になってしまうケースがあります。
そういった時に、importされた場合に実行してほしくないコード(テストコードなど)に記載します。
今度は、test1.pyをimportしてhelloと表示するメソッドだけを使いたいとします。
def hello():
print('hello')
print('test')
import test1
test1.hello()
test1.pyをインポートして、helloメソッドを呼び出しているので出力結果はhelloとなりそうですが・・・
test
hello
testが先に出力されていますね。これはtest1.pyに記載されていたprint(‘test’)の部分です。
今回は、ただtestと出力するだけのコードですが、これが単純ではないコードを記載していればバグに繋がりますね。
test1.pyのメソッドをインポートしただけなのに、他のスクリプトが実行されてしまっています。
ここで登場するのが本題でもある__name__と__main__です。
他のモジュールをインポートしたい、しかし他の人が読み込んだ時に実行されたくないコードがある。
このような場合、test1.pyをこのように書きます。
def hello():
print('hello')
if __name__ == '__main__':
print('test')
このif __name__ == ‘__main__’の記載を見たことがある人も多いのではないでしょうか?
これは、このファイルが直接実行されない限り、以下のスクリプトを実行しないと同義です。
つまり、他で呼び出された場合に実行されたくないテスコードなどをこのように記載します。
test.pyを実行してみます。先ほどは誤ってprint(‘test’)まで実行されていましたがどうでしょうか。
hello
今度はprint(‘test’)のコードは読み込まれていませんね。
このようにモジュールをインポートする際に、実行されてほしくないコードなどはこのように記載します。
Pythonの参考書は一人で勉強することが前提となっているため、こうした記述をしていない書籍もありますが実際の開発の現場ではよく使われる記述なので覚えておきましょう。