ローカル変数、グローバル変数の一覧取得
ビルトイン関数のlocals関数を用いてローカル変数の一覧を辞書オブジェクトで取得できる。
code:python
hoge = 1, 2, 3
piyo = 'Moji'
result = locals()
print(type(result))
print('# 辞書の全要素表示\n', result)
print('# 変数hogeに格納された値を表示:', result'hoge')
print('# 変数piyoに格納された値を表示:', result'piyo')
実行結果は以下の通り
code:python
<class 'dict'>
# 辞書の全要素表示
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fbedbcb1640>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'pp.py', '__cached__': None, 'hoge': 1, 2, 3, 'piyo': 'Moji', 'result': {...}}
# 変数hogeに格納された値: 1, 2, 3
# 変数piyoに格納された値: Moji
次のようにすると、呼び出し先の関数内部のローカル変数の状態を取得することができる。
code:python
def func():
hoge = 1, 2, 3
piyo = 'piyo'
result = locals()
piyo = 'POYO' # (1)
return result
# main部
result = func()
print('# 変数hogeに格納された値:', result'hoge')
print('# 変数piyoに格納された値:', result'piyo')
上記ソースコードをよく眺められたし。locals関数を呼び出した時点で変数piyoに格納された値は(1)で書き換えられているが、次に示す実行結果から、locals関数が返す辞書型オブジェクトは実行された時点の状態を保持していることが確認できる。
code:python
# 変数hogeに格納された値: 1, 2, 3
# 変数piyoに格納された値: piyo
この機能はデバッグに活用することができる。
インスタンスメソッドのローカル変数を確認しよう。
code:python
class Hoge:
value_class = 'クラス変数'
def func(self):
value_local = 'ローカル変数'
self.value_instance = 'インスタンス変数'
print(locals())
h1 = Hoge()
h1.func()
# 実行結果
# {'self': <__main__.Hoge object at 0x7f2b6dda8970>, 'value_local': 'ローカル変数'}
上の結果から、インスタンスメソッドのスコープについて以下のことがわかる。
selfはローカル変数である
インスタンス変数はスコープ外である、そのためアクセスするにはselfを介する必要がある
クラス変数はスコープ外である、そのためアクセスするにはクラス名を介する必要がある
また、globals関数を用いることでグローバル変数の一覧を辞書型オブジェクトで取得することができる。