コンテンツにスキップ

モジュールの再読み込みをPythonで簡単にする方法

[

モジュールのリロード

Pythonのモジュールは、通常インタプリタセッションごとに一度だけロードされます。関数やクラスの定義など、モジュールの大部分を構成する要素にとっては、これで問題ありません。しかし、モジュールには初期化などのために実行可能な文も含まれることがあります。注意すべきは、これらの文はモジュールの最初のインポート時にのみ実行されるということです。

まず、以下の例のmod.pyを見てみましょう。

s = "コンピュータは役に立たない。答えしか教えてくれない。"
a = [100, 200, 300]
def printy(arg):
print(f'arg = {arg}')
class Classy:
pass
print(f'a = {a}')

上記のコードを実行すると、以下の結果が得られます。

>>> import mod
a = [100, 200, 300]
>>> import mod
>>> import mod
>>> mod.a
[100, 200, 300]
>>> mod.s
'コンピュータは役に立たない。答えしか教えてくれない。'

print()文は後続のインポートでは実行されません。(その他の代入文も同様ですが、mod.aの値が表示された最後の表示のように、値の代入は守られます。) モジュールに変更を加えて再ロードする必要がある場合、インタプリタを再起動するか、モジュールimportlibreload()関数を使用する必要があります。

例えば、mod.pyを以下のように変更します。

s = "コンピュータは役に立たない。答えしか教えてくれない。"
a = [100, 200, 300]
def printy(arg):
print(f'arg = {arg}')
class Classy:
pass
print(f'a is equal {a}')

再度、modをインポートしてみましょう。

>>> import mod
>>> exit()

何も起こらず、ファイルの変更が表示されません。REPLを終了してから再度開始します。

>>> import mod
a is equal [100, 200, 300]
>>> import mod
>>> import importlib
>>> importlib.reload(mod)
a is equal [100, 200, 300]

上記のように、再ロードされ、print()文が実行されます。これで、モジュールの変更をリロードする手段が提供されます。

次のビデオでは、Pythonのパッケージについて詳しく説明します。

モジュールをリロードする方法

ここまでは、モジュールを単純に一度だけインポートしてきました。対話的な環境でモジュールのコードを変更する必要がない場合は、リロードする必要はありません。重要なのは、モジュール内の変更が以前にインポートしたものに反映されないということです。これを解決するためには、セッションを再起動するか、importlib.reload()を使う必要があります。また、Jupyterノートブックのような場所でも、現在の状態が明確でない場合に必要になることがあります。

以下のコードでは、my_moduleというモジュールをリロードする方法について説明します。

import importlib
# 前の状態を表示
print(my_module.some_variable)
# モジュールをリロード
importlib.reload(my_module)
# リロード後の状態を表示
print(my_module.some_variable)

リロードしたモジュールの状態を表示するために、importlib.reload()を使用しています。

なお、reload()関数を使用してモジュールをリロードすると、依存関係がある他のモジュールまではリロードされません。もしも他のモジュールもリロードしたい場合は、それぞれのモジュールに対してreload()関数を呼び出す必要があります。

モジュールのインポートとリロードに関する詳細は、公式ドキュメントを参照してください。

以上が、Pythonのモジュールのリロードについての詳細な説明です。この方法を使えば、モジュールの変更を簡単に反映させることができます。

サンプルコード

以下に、モジュールのリロードのサンプルコードを示します。

import importlib
# モジュールのロード
import my_module
# モジュールの再ロード
importlib.reload(my_module)

このようにして、モジュールをリロードすることができます。

以上がPythonのモジュールのリロードについての解説です。モジュールをリロードする際には、importlib.reload()を使用し、モジュールの変更を反映させることができます。