我必须从一个'模块'获取静态信息到另一个'模块'。我正在尝试编写记录器,其中包含有关我们正在记录的代码位置的信息。 例如,在某些文件中:
LogObject.Log('Describe error', STATIC_INFORMATION)
静态信息是类名,文件名和函数名。 我从中得到了它:
__file__
self.__class__.__name__
sys._getframe().f_code.co_name
但是我不想在记录期间写这个变量。我可以创建一些功能并调用它。例如:
LogObject.Log('Describe error', someFunction())
如何使用它来获取静态信息?
答案 0 :(得分: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())
答案 1 :(得分:2)
首先,请使用小写名称作为对象和方法。仅对类定义使用UpperCase名称。
更重要的是,你想要在每个班级都有一个聪明的内省功能。
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的子类,你将在所有类中继承这个识别函数。