Frage

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. Somewhere along the line, obj causes something bad to happen, and I'd like to point the user to where obj was instantiated.

I was hoping I could use the inspect module to find out in which file and at what line number obj was instantiated. Unfortunately, the inspect.getsourcefile and inspect.getsourcelines do not support instances. Is there a technical reason why this is not supported?

Is there another way I can obtain the data I'm looking for?

War es hilfreich?

Lösung

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)

Andere Tipps

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]: 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top