我想在脚本之间记录所有文件写操作,我想知道哪个方法/类进行了写操作。例如,我有这段代码
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
答案 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]
,您可能会感兴趣。my_A_instance.a()
就可以有效地替换前两行。caller = sys._getframe(1)
或del
帧对象,例如.clear()
。