2013-01-19 19 views
8

मैं रनटाइम पर पता लगाने की कोशिश कर रहा हूं, जहां एक ऑब्जेक्ट को तुरंत चालू किया गया है, क्योंकि यह मेरी लाइब्रेरी के उपयोगकर्ताओं को एक बहुत ही उपयोगी त्रुटि संदेश प्रदान करने में सक्षम होगा।मैं कैसे पता लगा सकता हूं कि ऑब्जेक्ट को तुरंत चालू किया गया है?

मान लीजिए कि हमें निम्नलिखित कोड है:

import mylib 

obj = mylib.MyClass() 

obj तो mylib से दूसरे वर्ग का एक उदाहरण के लिए पारित हो जाता है, और एक अद्भुत यात्रा पर आय। लाइन के साथ कहीं, obj कुछ बुरा होने का कारण बनता है, और मैं उपयोगकर्ता को इंगित करना चाहता हूं कि obj तत्काल था।

मुझे उम्मीद थी कि मैं inspect मॉड्यूल का उपयोग कर सकता हूं ताकि यह पता चल सके कि कौन सी फाइल और किस लाइन नंबर obj को तत्काल किया गया था। दुर्भाग्य से, inspect.getsourcefile और inspect.getsourcelines उदाहरणों का समर्थन नहीं करते हैं। क्या कोई तकनीकी कारण है कि यह समर्थित नहीं है?

क्या कोई और तरीका है जिसे मैं डेटा ढूंढ सकता हूं जिसे मैं ढूंढ रहा हूं?

+0

क्या यह अधिक जटिल नहीं है? जब कुछ बुरा होता है, तो हम सब कुछ क्यों नहीं करते (संभवतः) करते हैं? जैसा कि: आयात ट्रेसबैक + कोशिश करें: ... को छोड़कर: traceback.print_exc() – StefanNch

उत्तर

8

आप अपने वर्ग के निर्माता में इस जानकारी को रिकॉर्ड कर सकते हैं:

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

उत्कृष्ट! मुझे पता था कि पाइथन मुझे निराश नहीं करेगा। –

+0

दुर्भाग्यवश यह सबक्लास के लिए इतना अच्छा काम नहीं करता है, क्योंकि विरासत का प्रत्येक स्तर एक नया ढेर फ्रेम है और यह संबंधित प्रत्येक ऑब्जेक्ट के लिए स्थिर नहीं हो सकता है। तो कुछ अतिरिक्त तर्क यह निर्धारित करने के लिए कि कितने फ्रेम वापस जाने की आवश्यकता हो सकती है। एकाधिक विरासत शामिल होने पर यह और भी जटिल हो जाता है। – meowsqueak

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]: 
संबंधित मुद्दे

 संबंधित मुद्दे