2009-05-24 83 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