【初心者向け】Pythonの if __name__ == "__main__" の意味と使い方を徹底解説
Pythonインタープリターがソースファイルを読み込むと、そのファイル内に書かれたすべてのコードが実行されます。
特殊変数 __name__ の正体
コードを実行する前に、Pythonはいくつかの特殊な変数を定義します。その一つが __name__ です。
- Pythonインタープリターがそのモジュール(ソースファイル)をメインプログラムとして直接実行している場合、
__name__には"__main__"という値が設定されます。 - 逆に、そのファイルが別のモジュールからインポートされた場合には、
__name__にはモジュール名が設定されます。
なぜこのチェックが必要なのか?
この仕組みが役立つ理由は、開発者が書くモジュール(.pyファイル)には、次の2つの使い方が考えられるからです。
- 直接実行してプログラムとして動かす
- 別のモジュールにインポートして、関数やクラスを再利用する
if __name__ == "__main__": のチェックを入れておけば、「モジュールをプログラムとして実行するときだけ」特定のコード(テスト処理やデモなど)を実行でき、単に関数を使いたいだけの人がモジュールをインポートしたときには余計な処理が走らないようにできます。
具体例:one.py と two.py で動作を確認しよう
ここでは2つのファイル one.py と two.py を用意して、実際の動作を見てみましょう。
one.py
def func():
print("func() in one.py")
print("Root of one.py")
if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported")two.py
import one
print("Root of two.py")
one.func()
if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported")one.py を直接実行した場合
$ python one.py
出力結果:
Root of one.py one.py is being run directly
one.py はメインプログラムとして実行されているため、__name__ が "__main__" になり、if文の中の処理が実行されています。
two.py を実行した場合(one.py をインポート)
$ python two.py
出力結果:
Root of one.py one.py is being imported Root of two.py func() in one.py two.py is being run directly
このとき、one.py はインポートされたため、__name__ の値は "one"(モジュール名)になります。その結果、「one.py is being run directly」ではなく「one.py is being imported」が出力され、if文の中のコードはスキップされます。
まとめ
__name__は、ファイルが直接実行されたかインポートされたかを判別できる特殊変数。if __name__ == "__main__":を使えば、スクリプトとして実行したときのみ動かしたい処理(テスト・デモ・CLI処理など)を分離できる。- モジュールを再利用しやすくするための、Pythonにおける重要な定番イディオム。
-
Pythonの「%」演算子とは?文字列フォーマットの基本と使い方を解説
Pythonの「%」演算子の役割 Pythonにおける「%(パーセント)」は、文字列フォーマット演算子(補間演算子)として機能します。「format % values」という形式で記述すると、フォーマット文字列内の変換指定子が、values側の要素によって置き換えられます。この仕組みは、C言語のsprintf()関数とよく似ています。 基本的な使い方:文字列の埋め込み 最もシンプルな例は、文字列の中に変数の値を埋め込むケースです。 >>> lang = Python >>> print %s is awesome! % lang Python is awe
-
Pythonの文字列リテラルの先頭に付く「b」とは?意味と役割をわかりやすく解説
「b」プレフィックスの基本的な意味Pythonで文字列リテラルの先頭に付ける「b」または「B」は、そのリテラルがバイト列(bytes型)であることを示すプレフィックスです。この記号の挙動は、Python 2とPython 3で大きく異なるため、注意が必要です。Python 2での扱いPython 2では、「b」や「B」のプレフィックスは単純に無視されます。Python 2では通常の文字列リテラル自体がバイト列として扱われるため、「b」を付けても付けなくても動作に違いはありません。Python 3での扱い一方、Python 3ではバイト列リテラルには必ず「b」または「B」を前置します。「b」を付