Python - 获取静态信息

1 投票
2 回答
1122 浏览
提问于 2025-04-15 11:48

我需要把一些静态信息从一个“模块”传递到另一个模块。我正在尝试写一个日志记录器,记录代码中日志的来源位置。

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())

撰写回答