2009-05-24 101 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()) 
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 2009-05-24 11:16:46

+0

你試過了嗎?如果每個類都是Loggable的子類,則每個類將爲該類的每個對象生成適當的值。它將在多個文件中工作。嘗試一下。 – 2009-05-24 11:39:30