我如何找到一个对象被实例化的位置?
我想在程序运行时找出一个对象是在哪里被创建的,这样我就可以给使用我这个库的用户提供一个非常有用的错误信息。
假设我们有以下代码:
import mylib
obj = mylib.MyClass()
obj
然后被传递给 mylib
中另一个类的实例,接着开始了一段美妙的旅程。可是在某个地方,obj
引发了一些问题,我希望能告诉用户 obj
是在哪里被创建的。
我原本希望能用 inspect 模块来找出 obj
是在哪个文件和哪一行被创建的。不幸的是,inspect.getsourcefile
和 inspect.getsourcelines
这两个方法不支持实例对象。请问这是出于什么技术原因吗?
有没有其他方法可以获取我想要的数据呢?
2 个回答
0
也许你想要这个吧??
In [1]: def checkinstance(prohibitedclass):
...: import sys
...: final_result=set()
...: for x in sys._getframe(1).f_locals:
...: if isinstance(sys._getframe(1).f_locals.get(x),prohibitedclass):
...: final_str="instance of class %s is at: %s"%(prohibitedclass,sys._getframe(1).f_locals.get(x))
...: final_result.add(final_str)
...: return list(final_result)
In [2]: class not_allowedclass(object):
...: pass
In [3]: checkinstance(not_allowedclass)
Out[3]: []
In [4]: nk=not_allowedclass()
In [5]: nk1=not_allowedclass()
In [6]: checkinstance(not_allowedclass)
Out[6]:
["instance of class <class '__main__.not_allowedclass'> is at: <__main__.not_allowedclass object at 0x102dcdb10>",
"instance of class <class '__main__.not_allowedclass'> is at: <__main__.not_allowedclass object at 0x102dcda90>"]
In [7]: nk
Out[7]: <__main__.not_allowedclass at 0x102dcda90>
In [8]: nk1
Out[8]: <__main__.not_allowedclass at 0x102dcdb10>
In [9]:
9
你可以在你类的构造函数里记录这些信息:
import traceback
class MyClass(object):
def __init__(self):
self.traceback = traceback.extract_stack()[-2]
obj = MyClass()
print 'Instantiated in {0}:{1}'.format(*obj.traceback)