2017-08-02 8 views
6

にいる機能の*フル*名を取得する方法を次のコード:Pythonの:そのような方法があり、私は

import traceback 

def log(message): 
    print "%s: %s" %(traceback.extract_stack()[0:-1][-1][2], message) 

def f1(): 
    log("hello") 

class cls(object): 
    def f1(self): 
     log("hi there") 

f1() 
mycls = cls() 
mycls.f1() 

表示されます。代わりに

f1: hello 
cls.f1: hi there 

f1: hello 
f1: hi there 

私はジュリアン

はEDIT

...「検査」モジュールを使用することを試みたが成功しませんでした:

ここでのポイントは、取得できるようにする機能を「ログ」のためでありますその呼び出し元の (traceback、inspect、または必要な手段を使用して)独自の名前を使用します。

私はクラス名、または 'メッセージ'以外のものを 'log'関数に 渡したくありません。

+1

['__qualname__'](https://www.python.org/dev/peps/pep-3155/)を使用できますか? – mgilson

+0

https://stackoverflow.com/questions/10973362/python-logging-function-name-file-name-line-number-using-a-single-file –

+0

@mgilsonはpython2.xの構文を与えられました。そうじゃない? –

答えて

-1

inspectモジュールは非常に強力ですが、あなたは関数の名前、そしておそらくまた、クラス名を取得するためにtracebackを使用する方法と同様に使用することができます。しかし、あなたは単にあなたが独自のタイプ/クラスを知っているselfインスタンス変数を、持っているという事実を利用することができます:

import inspect 

class cls(object): 
    def f1(self): 
     this_class_name = type(self).__name__ 
     this_func_name = inspect.currentframe().f_code.co_name 
     print(this_class_name, this_func_name) 

mycls = cls() 
mycls.f1() 
+0

あなたは正しいです。 しかし、私は本当に達成しようとしています(私は明白に私の質問で尋ねていません申し訳ありません)、トレースバックからクラス名を取得するために、私の 'ログ'関数の引数として渡す必要はありません。 –

0

は、だから私は最終的にこの方法を思い付いた:

#!/usr/bin/env python3 

def log(message): 
    import inspect 
    import gc 
    code = inspect.currentframe().f_back.f_code 
    func = [obj for obj in gc.get_referrers(code) if inspect.isfunction(obj)][0] 
    print(func.__qualname__, message) 

をそれが必要__qualname__を使用できるようにします。

関連する問題