2013-01-19 15 views
8

Kitaplığımdaki kullanıcılara çok yararlı bir hata iletisi sağlamaya olanak tanıyacağı için, çalışma zamanında, nesnenin nerede oluşturulduğunu bulmaya çalışıyorum. harika bir yolculuğa Nesnenin nerede oluşturulduğunu nasıl öğrenebilirim?

import mylib 

obj = mylib.MyClass() 

obj

sonra mylib diğerine sınıfının bir örneğine geçirilir ve gelirleri:

aşağıdaki kodu olduğunu varsayalım. Satır boyunca bir yerde, obj, kötü bir şeyin oluşmasına neden oluyor ve kullanıcıyı, obj nolu örneğe yönlendirmek istiyorum.

obj numaralı satırın hangi dosyada ve hangi satır numarasıyla oluşturulduğunu öğrenmek için inspect modülünü kullanabileceğimi umuyordum. Ne yazık ki, inspect.getsourcefile ve inspect.getsourcelines örnekleri desteklemiyor. Bunun desteklenmemesinin teknik bir sebebi var mı?

Aradığım verileri elde etmenin başka bir yolu var mı?

+0

bu aşırı karmaşık değil mi? Kötü bir şey olduğunda, neden hepimizin (muhtemelen) yaptıklarını yapmıyoruz? İçinde olduğu gibi: import traceback + try: ... hariç: traceback.print_exc() – StefanNch

cevap

8

Sen sınıfının yapıcı bu bilgileri kayıt olabilir:

import traceback 

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

obj = MyClass() 

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

Mükemmel! Python'un beni hayal kırıklığına uğratmayacağını biliyordum. –

+0

Ne yazık ki bu, alt sınıflar için pek işe yaramıyor, çünkü kalıtımın her seviyesi yeni bir yığın çerçevesi ve ilgili her nesne için sabit olmayabilir. Bu yüzden kaç tane kareye geri dönüleceğini belirlemek için ekstra bir mantık gerekli olabilir. Birden fazla kalıtım söz konusu olduğunda bu durum daha da karmaşıklaşır. – meowsqueak

0

Bunu ister olabilir ??

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]: 
İlgili konular