记录:记录实例化类的位置

时间:2014-10-22 17:25:42

标签: python oop logging

我想在脚本之间记录所有文件写操作,我想知道哪个方法/类进行了写操作。例如,我有这段代码

import logging

logger = logging.getLogger('root')
#FORMAT = "[%(filename)s:%(funcName)20s() ] %(message)s"
#logging.basicConfig(format=FORMAT)
logger.setLevel(logging.DEBUG)


class FileWrite:
    def __init__(self,filename):
        self.filename = filename
        self.f = open(filename,'w')

    def __enter__(self):
        return self.f

    def __exit__(self):
        self.f.close()
        logger.debug("Write to: {}".format(self.filename))

当我运行像这样的代码时,我希望能够记录哪个方法进行了写操作

class A:
    def a():
        with FileWrite("file.txt") as f:
            f.write("something")

应该记录" file.txt"是由方法A.a

写的

1 个答案:

答案 0 :(得分:1)

这是通常不应该做的事情之一......但偶尔也会有意义。我不确定你的案件是否合格,但我会告诉你如何去做。

您正在寻找的是有关调用当前帧的函数的信息。 inspect文档中的The interpreter stack显示了如何获取此信息:

frame = inspect.currentframe()
caller = frame.f_back
name = caller.f_code.co_name

需要注意的一些事项:

  • 这将为您提供代码对象的名称,该名称用作def时间的名称,该名称可能与调用该函数的名称不同。重要的是,在您的情况下,在def时,这只是一个函数,a,而不是方法,A.a,所以您不会得到后者。 (请注意,回溯以相同的方式打印裸函数名称 - 因为它们具有您在此处所具有的相同信息。)
  • 您还可以获取文件名和行号(同样,那些将是def语句),并且使用该信息inspect模块可以获得更多信息。< / LI>
  • 在某些情况下,inspect.stack(1)[1]返回的“帧记录”可能具有更多“运行时间y”而不是定义时间信息,但通常不会。 (大部分信息是直接从帧属性中提取的,但有些信息会被从源中提取的信息覆盖,如果可用的话。有关详细信息,请参阅getframeinfo。)例如,您可以查看{{1获取源代码行inspect.stack(1)[2][4],您可能会感兴趣。
  • 这需要Python 3.4。如果您使用3.3或更早版本,只要您只关心CPython,my_A_instance.a()就可以有效地替换前两行。
  • 如果您的应用是多线程(或绿色线程),您可能需要在调用任何缓慢/阻塞之前明确caller = sys._getframe(1)del帧对象,例如.clear()