8

Pythonの特定の関数の呼び出し元に関する情報を取得したい。例えば:

class SomeClass():
    def __init__(self, x):
        self.x = x
    def caller(self):
        return special_func(self.x)

def special_func(x):
    print "My caller is the 'caller' function in an 'SomeClass' class."

Pythonで可能ですか?

4

3 に答える 3

12

はい、この関数を使用すると、現在の実行スタックからフレームを取得できます。フレームは、モジュールsys._getframe()にあるメソッドとドキュメントで検査できます。情報だけでなく、属性で特定のローカルを探します。inspectf_localsf_code

import sys
def special_func(x):
    callingframe = sys._getframe(1)
    print 'My caller is the %r function in a %r class' % (
        callingframe.f_code.co_name, 
        callingframe.f_locals['self'].__class__.__name__)

各フレームにどのような種類の情報があるかを検出するには、注意が必要です。

sys._getframe()f_backフレームオブジェクトを返します。それぞれの参照に従うことで、スタック全体をチェーンできます。または、このinspect.stack()関数を使用して、追加情報を含むフレームのリストを生成できます。

于 2012-08-03T16:07:50.003 に答える
3

例:

def f1(a):
    import inspect
    print 'I am f1 and was called by', inspect.currentframe().f_back.f_code.co_name
    return a

def f2(a):
    return f1(a)

「即時」の発信者を取得します。

>>> f2(1)
I am f1 and was called by f2

そして、他の人から呼び出されなかった場合は、(IDLEで)次のようになります。

>>> f1(1)
I am f1 and was called by <module>
于 2012-08-03T16:10:50.600 に答える