Pythonのimportで自作moduleの何が読み込まれるか確認する


はじめに

Pythonのproject開発において、自分やteam memberが作ったmoduleを読み込む時に、実際にどのobjectが読み込まれるのかを簡単に調べてみました。

環境

Python: 3.7.3

読み込まれるmodule

import_me.py
print('outside function!!') # これが読み込まれるのかどうかを知りたい

def drink_morning():
    print('coffee')

def drink_evening():
    print('beer')

呼び出すmodule(importでmodule全体を読み込む場合)

test_a.py
import import_me

import_me.drink_morning()
import_me.drink_evening()

実行結果:

outside function!!
coffee
beer

呼び出すmodule(from+importでobject指定で読み込む場合)

test_b.py
from import_me import drink_morning

drink_morning()

実行結果:

outside function!!
coffee

意外な結果かもしれません。object指定せずに読み込んだ場合においても、classやfunction以外のobjectは読み込まれます。
当然ですが、drink_eveningを呼ぶとerrorとなります。

test_b.py
from import_me import drink_morning

drink_morning()
drink_evening()

実行結果:

NameError: name 'drink_evening' is not defined

まとめ

classやfunctionをimportする場合はその対象を明記することが多いですが、「明記しないobject」が実際には読み込まれるのかどうかを理解しておくメリットとしては次が挙げられます。

  • 使用しないobjectを読み込まない記述が出来るようになることで、無駄なmemoryを使用せずに済む
  • objectを重複して読み込むことを避けるsimpleな記述が出来る

これらは細かいことかもしれませんが、Pythonをより理解し、一歩高いlevelの開発につなげるものと言えます。