Python - 获取静态信息
我需要把一些静态信息从一个“模块”传递到另一个模块。我正在尝试写一个日志记录器,记录代码中日志的来源位置。
LogObject.Log('Describe error', STATIC_INFORMATION)
静态信息包括类名、文件名和函数名。我是通过这个方式获取这些信息的:
__file__
self.__class__.__name__
sys._getframe().f_code.co_name
但是我不想在记录日志的时候每次都写这些变量。我可以创建一个函数来调用它吗?比如:
LogObject.Log('Describe error', someFunction())
我该如何使用这个函数来获取静态信息呢?
2 个回答
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 的子类,那么你在所有类中都会继承这个识别功能。
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())