Categories: Python

【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__':
    # 何かしらの処理

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago