Pythonのglobals()・locals()・reload()関数の使い方を徹底解説
Pythonには、名前空間(ネームスペース)の中身を確認できる便利な組み込み関数として globals() と locals() が用意されています。この記事では、これら2つの関数の違いと使い方、さらにモジュールを再読み込みする reload() 関数についてわかりやすく解説します。
globals()とlocals()とは
globals() と locals() は、呼び出された位置に応じて、それぞれグローバル名前空間とローカル名前空間に存在する名前(変数名や関数名など)を返す関数です。
関数内で呼び出した場合の挙動
locals() を関数内で呼び出した場合、その関数の内部からローカルにアクセスできるすべての名前が返されます。つまり、その関数内で定義された変数や引数などが含まれます。
globals() を関数内で呼び出した場合、その関数からグローバルにアクセスできるすべての名前が返されます。モジュールレベルで定義された変数や組み込み関数などが該当します。
戻り値は辞書型
両方の関数の戻り値は辞書(dict)型です。そのため、keys() メソッドを使えば、名前空間に登録されている名前の一覧を簡単に取り出せます。
def sample_func():
x = 10
print(locals().keys()) # ローカル名前空間の名前一覧
print(globals().keys()) # グローバル名前空間の名前一覧
sample_func()
reload()関数でモジュールを再読み込みする
モジュールをスクリプトにインポートすると、モジュールのトップレベルにあるコードは最初のインポート時に一度だけ実行されます。以降、同じモジュールを何度インポートしても、トップレベルのコードは再実行されません。
そこで、モジュールのトップレベルコードを再実行したい場合に活躍するのが reload() 関数です。reload() を使うと、すでにインポート済みのモジュールを再度読み込むことができます。
reload()の構文
reload(module_name)
ここで指定する module_name は、再読み込みしたいモジュールオブジェクトそのものです。モジュール名を格納した文字列ではない点に注意してください。
たとえば、hello モジュールを再読み込みする場合は次のように記述します。
import hello reload(hello)
補足:Python 3でのreload()の扱い
reload() はPython 2では組み込み関数として提供されていましたが、Python 3では組み込み関数から削除され、imp モジュール(Python 3.4以降は非推奨)や標準ライブラリの importlib に移動しています。Python 3環境でモジュールを再読み込みする場合は、次のように記述します。
import importlib import hello importlib.reload(hello)
このように、実行しているPythonのバージョンに応じて適切な方法を選択することが重要です。
-
Pythonの関数とオブジェクトメソッド、どちらがより基本的?
Pythonにおける「関数」とは何か Pythonにおいて、関数とは「呼び出し可能(callable)」なオブジェクトのことです。つまり、呼び出し演算子 () を使って実行できるオブジェクトを指します。ただし、関数だけが呼び出せるわけではありません。__call__ という特殊メソッドを実装すれば、どんなオブジェクトでも関数のように振る舞わせることができます。 関数の定義例 def a(): pass # a() は関数の一例 print(a) print(type(a)) 出力結果 <function a at 0x0000000005765C18> <clas
-
Pythonの関数名の前後に付く__(ダブルアンダースコア)の意味とは?理由をわかりやすく解説
Pythonのコードを読んでいると、__init__ や __str__ のように、名前の前後にダブルアンダースコア(二重のアンダースコア __)が付いた関数やメソッドを目にすることがあります。これらは「ダンダー(dunder:double underscore の略)メソッド」あるいは「特殊メソッド」「マジックメソッド」と呼ばれるもので、Pythonの言語仕様において特別な意味を持つ名前です。 ダブルアンダースコアはPython側で予約された名前 前後にダブルアンダースコアが付いた名前は、Pythonの組み込み機能(ビルトイン)として実質的に予約されています。これらはクラスの振る舞いをカス