2009-05-22 8 views
74

あなたのような2つの機能を持っている場合:呼び出し元関数名をPythonの別の関数の中に入れていますか?

def A 
def B 

とAは次のようにBが、あなたは、Bの内側にBを呼び出している誰が取得することができます呼び出します:あなたが呼び出しを取得するためにinspectモジュールを使用することができます

def A() : 
    B() 

def B() : 
    this.caller.name 
+1

ソースがあります。なぜあなたはそのようなことが必要でしょうか? –

+12

実際のデバッガがないサードパーティ製のアプリケーションのPythonインタプリタでコードをデバッグしているためです。 –

+3

[Python:呼び出されたメソッドで呼び出し元のメソッド名を取得する方法は?](http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in -the-called-method) – bernie

答えて

103

スタック。フレームレコードのリストを返します。各レコードの3番目の要素は呼び出し元の名前です。あなたが欲しいのはこれです:

>>> import inspect 
>>> def f(): 
...  print inspect.stack()[1][3] 
... 
>>> def g(): 
...  f() 
... 
>>> g() 
g 

もちろん、特定のインデックスにアクセスしようとする前に十分なフレームレコードが存在することを確認することをお勧めします。

+6

python 3.4では、少なくともこれは動作しません、彼らはタプルの順序を変更しました。名前付きタプルが使用されているので、inspect.stack()[1] .filenameを使用することをお勧めします。 – timeyyy

8

次の例のように:

>>> def foo(): 
... global x 
... x = sys._getframe(1) 
... 
>>> def y(): foo() 
... 
>>> y() 
>>> x.f_code.co_name 
'y' 
>>> 

重要な注意:それは(ちょっと、それはアンダースコアで始まる)_getframeメソッド名から明らかだとして、それは1つがむやみに頼るべきであるAPIメソッドではありません。 BaseConfig()内

+9

[sys._getframe](http://docs.python.org/library/sys.html#sys._getframe)is is 「Pythonのすべての実装では保証されていません」 - これは重要なことだと思います。 – RWS

+0

@RWS、ありがとうございます。 –

2

ユーザーロギングモジュールとは、%(ファイル名)を指定することができますsオプション

import logging 
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s') 

def A(): 
    logging.info('info') 
+1

あなたは誤って '%(filename)sオプション'と言っています。あなたのコード例には次のようなものが必要です: '%(funcName)s' :) –

10

sysを使用して二つの方法、およびinspectモジュールがあります。

  • は、
  • inspect.stack()[1][3]

stack()フォームは読みにくくし、実装依存であることがsys._getframe()を呼び出しているので、inspect.pyからの抽出物を参照してください。これが私のため

def stack(context=1): 
    """Return a list of records for the stack above the caller's frame.""" 
    return getouterframes(sys._getframe(1), context) 
4

作品! :D

>>> def a(): 
...  import sys 
...  print sys._getframe(1).f_code.co_name 
... 
>>> def b(): 
...  a() 
... 
... 
>>> b() 
b 
>>> 
関連する問題