フレームオブジェクトから実行スタック上の関数オブジェクトへの参照を取得していますか?
-
06-07-2019 - |
質問
inspect.stack()
の出力を考えると、スタックフレームのどこからでも関数オブジェクトを取得して呼び出すことができますか?もしそうなら、どのように?
(関数の名前を取得する方法はすでに知っています。)
ここに私が得ているものがあります:私が関数であり、呼び出し元がジェネレーターか通常の関数かを判断しようとしていますか?関数オブジェクトで inspect.isgeneratorfunction()
を呼び出す必要があります。そして、誰があなたに電話したのかをどのように把握しますか? inspect.stack()
、そうですか?それで、どうにかしてそれらをまとめることができれば、私の質問に対する答えがあります。おそらくこれを行う簡単な方法がありますか?
解決
これを行うコードスニペットを次に示します。エラーチェックはありません。アイデアは、呼び出された関数オブジェクトを祖父母のローカルで見つけることです。返される関数オブジェクトは親でなければなりません。ビルトインも検索する場合は、stacks [2] [0] .f_builtinsを調べるだけです。
def f():
stacks = inspect.stack()
grand_parent_locals = stacks[2][0].f_locals
caller_name = stacks[1][3]
candidate = grand_parent_locals[caller_name]
クラスの場合、次のように書くことができます(Marcinソリューションに触発された)
class test(object):
def f(self):
stack = inspect.stack()
parent_func_name = stack[1][3]
parent_func = getattr(self, parent_func_name).im_func
他のヒント
Eolmarの答えと非常によく似た次のアプローチを取りました。
stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)
所属していません StackOverflow