Python PR

【Python】__name__とエントリーポイント

記事内に商品プロモーションを含む場合があります

この記事では、Pythonの__name__とエントリーポイントについて解説します。

__name__は、全てのモジュールに定義されている属性の一つです。__name__といえば以下のようなコードを見たことがあると思います。

if __name__ == '__main__':
    # 何かしらの処理

上記コードは一体何をしていたのでしょうか?

それでは、__name__ついて学んでいきましょう!

__name__とは?

__name__とは、モジュールに定義されている属性の1つです。全てのモジュールに共通で用意されており、モジュールが実行される前に値がセットされます。

__name__には、モジュールの名前が文字列型で格納されており、基本的にモジュールをインポートする際にモジュール名を識別するのに使われます。

Link__name__ - インポートシステム — Python 3.9.4 ドキュメント

__name__の値

__name__属性には、モジュール名が完全修飾名で格納されています。

import sys
import random

print(sys.__name__)
print(random.__name__)

実行結果

sys
random

ただし、例外としてトップレベルで実行した(Pythonコマンドを使って実行した)モジュールの__name__には'__main__'が格納されています。

ターミナルまたはコマンドプロンプト

Python モジュール名.py

上記のように呼び出されたモジュール内で__name__を呼び出すと以下のように'__main__'が返される。

print(__name__)

実行結果

__main__
このように、Pythonコマンドで実行されたモジュールのことを「エントリーポイント」と呼んだりします

if __name__ == '__main__':

ということは以下のようなコードは、そのモジュールがトップレベルで実行された場合の処理を記述していた! ということになります。

if __name__ == '__main__':
    # 何かしらの処理

例えば以下のように__name____main__かどうか判定しない場合、そのモジュールをインポートするだけでprint()が処理されてしまう。

test.py

print('test.pyが実行された')

試しに他のモジュールからtest.pyをインポートしてみます。

main.py

import test

実行結果

test.pyが実行された

しかし、以下のように__name____main__かどうか調べることでトップレベルで実行された際にのみ処理させることができます。

test.py

if __name__ == '__main__':
    print('test.pyが実行された')

こうすることでインポートしても実行させなくようにできます。

import test

実行結果

まとめ

この記事では、Pythonの__name__について解説しました。

__name__には、

  • モジュール名(完全修飾名)
  • トップレベルで実行された場合は __main__

が格納されているのがわかりました!

利用方法としては__main__が格納されているか判定してトップレベルで実行された場合の処理を記述することができます。

if __name__ == '__main__':
    # 何かしらの処理

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ