2013-01-18 10 views
5

मेरे पास एक पायथन प्रोजेक्ट है जिस पर मैं काम कर रहा हूं, प्रिंट प्रिंट स्टेटमेंट्स के बजाय मैं एक फ़ंक्शन कहता हूं() ताकि उत्पादन के दौरान विकास और लॉग जानकारी के दौरान मैं जानकारी प्रिंट कर सकूं। हालांकि, मैं अक्सर इसे भूल जाता हूं और गलती से कोड में प्रिंट स्टेटमेंट डालता हूं। क्या पाइथन प्रोग्राम अपने स्रोत को पढ़ने के लिए वैसे भी है, और बाहर निकलने() अगर यह फ़ंक्शन के बाहर कोई प्रिंट स्टेटमेंट कहता है()?प्रिंट स्टेटमेंट्स को रोकने के लिए स्वयं स्कैनिंग कोड

+1

पर
प्रिंट बयान आप क्यों नहीं बस इसके साथ ऐसा नहीं करते अपने पाठ संपादक? – Blender

+1

ctrl f या ctrl r आपके टेक्स्ट एडिटर में .... –

+0

मेरा टेक्स्ट एडिटर कोड के निष्पादन पर चलने वाले आदेशों में असमर्थ है। – captainandcoke

उत्तर

7

यह ast मॉड्यूल का उपयोग किया जा सकता है:

from __future__ import print_function 
print = None 

एक साथ इस लाना अपने say() समारोह के साथ, आप की तरह कुछ कर सकता है। यदि आप पाइथन 3 या पायथन 2 पर print_function भविष्य के साथ print कथन और print() फ़ंक्शन के किसी भी कॉल को प्राप्त करेंगे।

import ast 

class PrintFinder(ast.NodeVisitor): 
    def __init__(self): 
     self.prints_found = [] 

    def visit_Print(self, node): 
     self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 

    def visit_Call(self, node): 
     if getattr(node.func, 'id', None) == 'print': 
      self.prints_found.append(node) 
     super(PrintFinder, self).generic_visit(node) 


def find_print_statements(filename): 
    with open(filename, 'r') as f: 
     tree = ast.parse(f.read()) 
    parser = PrintFinder() 
    parser.visit(tree) 
    return parser.prints_found 

print 'hi' 
for node in find_print_statements(__file__): 
    print 'print statement on line %d' % node.lineno 

इस उदाहरण के उत्पादन में है:

हाय
लाइन पर प्रिंट बयान 24 लाइन 26

1

जबकि मैं ऐसा करने की अनुशंसा नहीं करता हूं, अगर आप वास्तव में चाहते हैं कि पाइथन दुभाषिया print कथन को फिर से परिभाषित करके एक त्रुटि फेंक दे।

अगर पायथन 3 का उपयोग, बस अपने कोड की शुरुआत/शीर्ष के निकट यह डाल:

print = None 

किसी भी print बयान देखते हैं, तो आप एक TypeError: 'NoneType' object is not callable त्रुटि मिल जाएगा।

यदि पायथन 2.x का उपयोग करते हैं, तो आप Python 2.x को अतिव्यापी प्रिंट स्टेटमेंट रखने की अनुमति देने के लिए किसी अन्य answer में सुझाए गए विचार का उपयोग कर सकते हैं।

print_original = print 
print = None 

def say(data): 
    print = print_original 
    # Your current `say()` code here, such as: 
    print(data) # Could just use `print_original` instead. 
    # Redefine print to make the statement inaccessible outside this function. 
    print = None 
+0

'कोई नहीं' कॉल करने योग्य नहीं है, इसलिए जब आपका नया 'प्रिंट' "फ़ंक्शन" कहा जाता है तो यह अपवाद उठाएगा। वास्तव में ओपी क्या चाहता है वास्तव में नहीं। विशेष रूप से जब यह कोड वास्तव में निष्पादित किया जाता है तो यह केवल तभी टूट जाएगा। – ThiefMaster

+1

ओपी का कहना है कि वह अपने कार्यक्रम को बाहर निकलने के लिए चाहते हैं() अगर यह किसी भी प्रिंट स्टेटमेंट से मुकाबला करता है। अपवाद फेंकने से प्रोग्राम बाहर निकल जाएगा। हालांकि, मैं मानता हूं कि यह पहली जगह में एक बहुत ही वांछनीय बात नहीं है, लेकिन यह मुझे लगता है कि किसी के लिए काम कर सकता है। –

+1

मेरे लिए ऐसा लगता है जैसे वह पूरे स्रोत को देखना चाहता है और इसे निष्पादन के दौरान * कुछ * बिंदु पर नहीं करता – ThiefMaster

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