スタックを遡って指定変数名の値を拾いたかった。inspect使えばできました。
やりたいこと
def func0():
_v = "abc"
func1()
def func1():
# ここでスタックを遡って、直近の _v という変数名の値をとりたい
やった方法
スタックを遡って指定変数名の値を拾ってくる関数を定義。
実装:フレームをf_backで遡ってローカル変数名を検査。一致するものあればreturn。
import inspect
def get_backframe_localvalue(var_name):
frame = inspect.currentframe().f_back
while frame:
var_locals = inspect.getargvalues(frame).locals
if var_name in var_locals:
return var_locals[var_name]
frame = frame.f_back
return None
上記を使う
def func0():
_v = "abc"
func1()
def func1():
print(get_backframe_localvalue("_v")) # abc
他の挙動例
直近のものを拾ってきます。存在しない場合はとりあえずNone返すようにしてみました。
def func0():
_v = "abc"
_vv = "def"
func1()
def func1():
_vv = "xyz"
func2()
def func2():
print(get_backframe_localvalue("_v")) # abc
print(get_backframe_localvalue("_vv")) # xyz
print(get_backframe_localvalue("_xx")) # None
なぜこれをやりたかったか
デバッグ用のアレをアレするのに、グローバル変数やスレッド単位ではなく、呼び出しスタックの単位で特定の値を埋め込みアクセスしたかった。
適当に使うと、わけわからなくなること必至だとは思う。