[英]How can I find out where an object has been instantiated?
I'm trying to find out, at runtime, where an object has been instantiated, as this would enable providing a very useful error message to users of my library. 我试图在运行时找出实例化对象的位置,因为这样可以向我的库用户提供非常有用的错误消息。
Suppose we have the following code: 假设我们有以下代码:
import mylib
obj = mylib.MyClass()
obj
is then passed to an instance of another class from mylib
, and proceeds on a wonderful journey. 然后将obj
从mylib
传递给另一个类的实例,并继续进行一次精彩的旅程。 Somewhere along the line, obj
causes something bad to happen, and I'd like to point the user to where obj
was instantiated. 在某个地方, obj
导致一些不好的事情发生,我想将用户指向obj
被实例化的地方。
I was hoping I could use the inspect module to find out in which file and at what line number obj
was instantiated. 我希望我可以使用inspect模块找出obj
被实例化的文件和行号。 Unfortunately, the inspect.getsourcefile
and inspect.getsourcelines
do not support instances. 不幸的是, inspect.getsourcefile
和inspect.getsourcelines
不支持实例。 Is there a technical reason why this is not supported? 是否存在技术原因导致不支持此操作?
Is there another way I can obtain the data I'm looking for? 有没有其他方法可以获得我正在寻找的数据?
You could record this information in your class's constructor: 您可以在类的构造函数中记录此信息:
import traceback
class MyClass(object):
def __init__(self):
self.traceback = traceback.extract_stack()[-2]
obj = MyClass()
print 'Instantiated in {0}:{1}'.format(*obj.traceback)
may be you want this?? 可能你想要这个?
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]:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.