我怎样才能找到对象被实例化的位置?

2024-07-07 03:47:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在运行时找出一个对象被实例化的位置,因为这样可以向库的用户提供非常有用的错误消息。在

假设我们有以下代码:

import mylib

obj = mylib.MyClass()

obj然后从mylib传递给另一个类的实例,并继续一段美妙的旅程。沿着这条线的某个地方,obj会导致一些不好的事情发生,我想告诉用户obj的实例化位置。在

我希望可以使用inspect模块来找出在哪个文件中实例化了obj的行号。不幸的是,inspect.getsourcefile和{}不支持实例。这是否有技术原因不受支持?在

有没有其他方法可以获得我要找的数据?在


Tags: 模块对象实例代码用户importobj消息
2条回答

可以在类的构造函数中记录此信息:

import traceback

class MyClass(object):
   def __init__(self):
       self.traceback = traceback.extract_stack()[-2]

obj = MyClass()

print 'Instantiated in {0}:{1}'.format(*obj.traceback)

你可能想要这个吗??在

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]: 

相关问题 更多 >