2009-05-24 8 views
1

静的情報を別の 'モジュール'から取得する必要があります。私はロギング先のコード場所に関する情報をロガーに書き込もうとしています。例えば は、いくつかのファイルに:Python - 静的情報を取得

LogObject.Log('Describe error', STATIC_INFORMATION) 

静的情報、クラス名、ファイル名、関数名です。 私はこのことからそれを得る:

__file__ 
self.__class__.__name__ 
sys._getframe().f_code.co_name 

しかし、私は、ロギング中にこの変数を記述する必要はありません。いくつかの関数を作成して呼び出すことはできますか?例:

LogObject.Log('Describe error', someFunction()) 

静的情報を取得するにはどうすればよいですか?

答えて

3

"静的"はあなたが探している世界だとは思わない。私が正しく理解していれば、呼び出し元のファイル名、クラス名、メソッド名を返す関数を記述したいと思うでしょう。

基本的に、sys._getframe(1)を使用して前のフレームにアクセスし、そこから作業する必要があります。

例:

def codeinfo(): 
    import sys 
    f = sys._getframe(1) 

    filename = f.f_code.co_filename 
    classname = '' 

    if 'self' in f.f_locals: 
     classname = f.f_locals['self'].__class__.__name__ 

    funcname = f.f_code.co_name 

    return "filename: %s\nclass: %s\nfunc: %s" % (filename, classname, funcname) 

その後メソッドからどこかで、あなたの返信用

logger.info("Some message \n %s" % codeinfo()) 
+0

ありがとうございますが、関数名はどうですか? – Ockonal

+0

が追加されました。しかし、これはあまり良いコードではありません。私は時間があるときにそれをきれいにしようとします。 – itsadok

+0

どこにでもありがとう、あなたのコードは正常に動作します。 – Ockonal

2

まず、オブジェクトとメソッドに小文字の名前を使用してください。クラス定義には大文字の名前のみを使用します。

さらに重要なことは、すべてのクラスで賢明な内省的な機能が必要なことです。

class Loggable(object): 
    def identification(self): 
     return self.__class__.__module__, self.__class__.__name__, sys._getframe().f_code.co_name 

class ARealClass(Loggable): 
    def someFunction(self): 
     logger.info("Some Message from %r", self. identification()) 

あなたのクラスのすべてがのLoggableのサブクラスである場合は、すべてのクラスでは、この識別機能を継承します。

+0

感謝を書き込むことができます。 >すべてのクラスがLoggableのサブクラスである場合。 いいえ、そうではありません。 Loggableクラスを他のモジュール(ファイル)に作成する場合、返すデータは必要なものではありません。それとも、私は理解できませんでしたか? – Ockonal

+0

試しましたか?各クラスがLoggableのサブクラスである場合、各クラスはクラスの各オブジェクトに対して適切な値を生成します。複数のファイルで動作します。それを試してみてください。 –

+0

正しい__module__を使用するように修正しました。 –

関連する問題