【Python】importと関数、__name__について【忘備録】

スポンサーリンク
programming 忘備録
スポンサーリンク

はじめに

Pythonでのimportと関数、main関数についてのかなり基礎的な内容です。

ほかの言語と混ぜて使っているとうっかり忘れていてエラーの原因になっていたりするので忘備録として残しておきます。

動作確認環境は次の通りです。

  • OS:Windows
  • Python:ver3.8.2

importは1度だけファイルを実行する

importは対象のpythonファイルを実行します。

例えば「helloworld」を出力する次のようなpythonファイルを「helloworld.py」として作成します。

print('helloworld')

「helloworld.py」を実行するともちろん出力は次のようになります。

>>python helloworld.py
helloworld

importは呼び出したpythonスクリプトを実行する

ここで、次のように「helloworld.py」をimportするpythonファイルを「sample.py」として作成します。

import helloworld

「sample.py」を実行すると出力は次のようになります。

>>python sample.py
helloworld

もちろんこんな書き方をする人はいないとは思いますが、importによって呼び出したpythonファイルが実行されていることは理解できました。

importは同じpythonファイルは1度しか実行しない

では「sample.py」を次のように書き換えるとどうなるでしょうか。

import helloworld
import helloworld

importでは同じpythonファイルは1度のみ実行されるので当然ですが、結果は先ほどと変わらず次のようになります。

>>python sample.py
helloworld

importと関数

上述のようにimportでは同じpythonファイルは1度しか実行してくれません。

関数を使うことで、毎回呼び出す形にはなりますが複数回同じ動作を実行可能にできます。

まずは「helloworld.py」を次のように関数とその関数を呼び出すようなスクリプトに書き換えます。

def hello():
    print('helloworld')

hello()

ここでhelloworld.pyを実行すると最初の時と同じように出力されます。

>>python helloworld.py
helloworld

関数のあるpythonファイルをimportする

ここで次のような「sample.py」を実行するとどうなるでしょう。

import helloworld

もちろん「helloworld.py」を実行したときと同じで、次のような出力になります。

>>python sample.py
helloworld

ここで「hello()」は関数なのでimportした先で呼び出すことができます。

つまり次のように「sample.py」を書き換えることができます。

import helloworld
helloworld.hello()

実行結果は次のようになります。

>>python sample.py
helloworld
helloworld

importした時とhello関数を呼び出した時とで2回「helloworld」が表示されます。

importと__name__

ようやくここで__name__という存在が役に立つ時が来ました。

「helloworld.py」を次のように書き直します。

def hello():
    print('helloworld')

if __name__ == '__main__':
    hello()

これを実行すると次のようになります。

>>python helloworld.py
helloworld

次のように書き換えた「sample.py」を実行します。

import helloworld
helloworld.hello()

結果は次のようになります。

>>python sample.py
helloworld

これは「__name__」が次のような性質を持つため、if文で条件分岐が可能だからです。

  • 「python 〇〇〇.py」のように実行された場合には「__main__」という文字列が格納される。
  • 「import 〇〇〇」のようにimportされて場合には「〇〇〇」という文字列が格納される。

つまり、最初の「python helloworld.py」の場合にのみif文の中身が実行されるため、importした際には実行されず、どちらも関数を1度だけ実行した結果が出力されているのです。

最後に

ほとんどの人にとっては当たり前のことかもしれませんが、割と真剣になんだっけと忘れやすいのがpythonスクリプトをすべて実行するというところですね。

ちなみに「from-import」でも一度はすべて実行されるのでぜひ確認してみてください。

コメント

タイトルとURLをコピーしました