LoginSignup
0
0

More than 5 years have passed since last update.

Python スタックを遡って指定変数名の値を拾ってくる

Last updated at Posted at 2018-12-11

スタックを遡って指定変数名の値を拾いたかった。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

なぜこれをやりたかったか

デバッグ用のアレをアレするのに、グローバル変数やスレッド単位ではなく、呼び出しスタックの単位で特定の値を埋め込みアクセスしたかった。
適当に使うと、わけわからなくなること必至だとは思う。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0