1

の出力が与えられた場合inspect.stack()、スタックフレームのどこからでも関数オブジェクトを取得してこれらを呼び出すことは可能ですか?もしそうなら、どのように?

(関数の名前を取得する方法はすでに知っています。)

これが私が得ているものです:私が関数であり、呼び出し元がジェネレーターであるか通常の関数であるかを判断しようとしているとしましょう。inspect.isgeneratorfunction()関数オブジェクトを呼び出す必要があります。そして、誰があなたを呼んだかをどうやって理解しますか?inspect.stack()、 右?ですから、どういうわけかそれらをまとめることができれば、私の質問に対する答えが得られます。おそらくこれを行うためのより簡単な方法がありますか?

4

2 に答える 2

2

これを行うコードスニペットを次に示します。エラーチェックはありません。アイデアは、呼び出された関数オブジェクトを祖父母のローカルで見つけることです。返される関数オブジェクトは親でなければなりません。ビルトインも検索したい場合は、単純に 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
于 2009-06-23T22:30:56.093 に答える
0

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)
于 2009-06-24T14:43:04.153 に答える