द्वारा फ़ंक्शन निष्पादन लाइन लॉग करने के लिए सजावटी मैं एक स्क्रिप्ट पर काम कर रहा हूं जिसमें चलाने के लिए कुछ मिनट लगते हैं, और उपयोगकर्ता को इसकी प्रगति के बारे में कुछ आउटपुट प्रदान करना चाहते हैं। दुर्भाग्य से मैं बहुत आलसी हूँ। मैं जो करना चाहता हूं वह लॉगिंग के बिना एक फ़ंक्शन लिखता है, और उसके बाद एक सजावट लागू करता है जो फ़ंक्शन के माध्यम से चलता है और उस पंक्ति को निष्पादित करने से पहले प्रत्येक पंक्ति को प्रिंट करता है। मूल रूप से मैं क्या तलाश कर रहा हूँ है एक loggingdecorator
ऐसी है कि:लाइन
>>> @loggingdecorator
... def myfunction():
... foo()
... bar()
... baz()
>>> myfunction()
Starting myfunction
foo() ... [OK]
bar() ... [OK]
baz() ... [OK]
myfunction Done!
यहाँ क्या मैं अब तक की कोशिश की है:
import sys
def logging_tracer(frame, event, arg):
def local_tracer(local_frame, event, arg):
if frame is local_frame:
print frame.f_code.co_name, event, arg
print frame.f_code.co_name, event, arg
return local_tracer
def loggingdecorator(func):
def _wrapper():
old_trace_function = sys.gettrace()
sys.settrace(logging_tracer)
try:
result = func()
except:
raise
else:
return result
finally:
sys.settrace(old_trace_function)
return _wrapper
दुर्भाग्य से, यह थोड़ा बहुत ज्यादा मुद्रण करता है; यह फंक्शन कॉल का पालन करता है और लाइन को लाइन से भी प्रिंट करता है (ठीक है, यह वास्तव में स्रोत लाइन को प्रिंट नहीं करता है, निरीक्षण का उपयोग कर मौजूदा उत्तरों, ट्रेस फ़ंक्शन में फ्रेम ऑब्जेक्ट पर सामान के साथ संयुक्त किया जाएगा), लेकिन मैं logging_tracer
के बारे में थोड़ा सा स्टंप किया गया है जब तक कि सवाल में वास्तव में सजाया नहीं जाता है।
आप उन सभी कार्यों पर एक ही सजावटी रख सकते हैं जिन्हें आप कॉल करना चाहते हैं। फिर अपने प्रिंट स्टेटमेंट को फ़ंक्शंस के अंदर रखें। जैसे-जैसे कार्य निष्पादित होते हैं, प्रिंट स्टेटमेंट भी चलाए जाते हैं। या आप सजावट के बारे में चिंता किए बिना बस प्रत्येक फंक्शन के भीतर प्रिंट स्टेटमेंट डाल सकते हैं और इसे अभी भी – smac89
@ Smac89 करना चाहिए, आपका सुझाव बहुत आक्रामक है। डीबग प्रिंट एक बहुत ही खराब ट्रेसिंग तकनीक है – J0HN
निकटतम चीज़ जो मैं सोचता हूं, line_profiler होगा। आप जो भी चाहते हैं उसे करने के लिए आप शायद इसी तरह की विधि का उपयोग कर सकते हैं। दुर्भाग्यवश, line_profiler सी/साइथन में लिखा गया है, इसलिए संशोधित करना इतना आसान नहीं है। –