【问题标题】:Python - get static informationPython - 获取静态信息
【发布时间】:2010-10-28 13:24:03
【问题描述】:

我必须从一个“模块”获取静态信息到另一个。我正在尝试使用有关我们正在记录的代码位置的信息编写记录器。 例如,在某个文件中:

LogObject.Log('Describe error', STATIC_INFORMATION)

静态信息是类名、文件名和函数名。 我从这里得到它:

__file__ 
self.__class__.__name__ 
sys._getframe().f_code.co_name

但我不想在记录期间写入这些变量。我可以创建一些函数并调用它吗?例如:

LogObject.Log('Describe error', someFunction())

如何使用它来获取静态信息?

【问题讨论】:

    标签: python variables static


    【解决方案1】:

    我不认为“静态”是您正在寻找的世界。如果我理解正确,您想编写一个函数来返回调用者的文件名、类名和方法名。

    基本上,您应该使用 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 的子类,您将在所有类中继承此标识功能。

    【讨论】:

    • 感谢您的回复。 >如果你所有的类都是 Loggable 的子类。不,他们不是。如果我将在其他模块(文件)中创建类 Loggable,它返回的数据将不是我需要的。还是我没听懂?
    • 你试过了吗?如果每个类都是 Loggable 的子类,则每个类都会为该类的每个对象生成适当的值。它将在多个文件中工作。试试看。
    • 我不应该从 logger 继承我的所有类。我的应用有另一种结构。
    • 这就是 mixin 的用途。您的类可以继承不止一件事 - 因此您可以执行 class MyClass(Loggable, MySuperClass) 并且您将继承可记录位和您自己的东西。
    • 或者,将object 替换为Loggable。如果你不是子类化对象,你应该是。
    猜你喜欢
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多