2009-11-04 18 views
7

मैं ऐसेअजगर के प्रिंट बयान के न्यू लाइन पीढ़ी व्यवहार

print >>f, "Content-Type: text/plain" 

के रूप में यह सब कुछ ठीक है और ईमेल के लिए अच्छा है कि प्रिंट बयान के एक बहुत कुछ शामिल कच्चे ईमेल एन्कोड करने के लिए विरासत कोड का एक समूह है ओवरराइड करना है, लेकिन हम HTTP अनुरोध को आउटपुट करने के लिए अब एक ही कोड का लाभ उठा रहा है। समस्या यह है कि पाइथन प्रिंट स्टेटमेंट '\n' आउटपुट करता है जबकि HTTP को '\r\n' की आवश्यकता होती है।

ऐसा लगता है कि अजगर की तरह (2.6.4 कम से कम) एक प्रिंट बयान जो कार्यान्वित किया जाता है के लिए एक अनुगामी PRINT_NEWLINE बाइट कोड के रूप में

ceval.c:1582: err = PyFile_WriteString("\n", w); 

इस प्रकार यह प्रतीत होता है कि वहाँ कोई आसान तरीका के डिफ़ॉल्ट न्यू लाइन व्यवहार को ओवरराइड करने के लिए उत्पन्न करता है प्रिंट। मैंने निम्नलिखित समाधानों को

  • आउटपुट लिखने के बाद बस .replace('\n', '\r\n') करें। यह HTTP संदेशों में हस्तक्षेप करेगा जो मल्टीपार्ट एन्कोडिंग का उपयोग करते हैं।
  • गंतव्य फ़ाइल वस्तु के चारों ओर एक आवरण और प्रॉक्सी .write विधि
  • def write(self, data): 
        if data == '\n': 
         data = '\r\n' 
        return self._file.write(data) 
    

  • एक रेगुलर एक्सप्रेशन तब्दील लिखें बनाएं print >>f, textf.write(text + line_end) के लिए जहां line_end हो सकता है '\n' या '\r\n'
  • मेरा मानना ​​है कि तीसरा विकल्प सबसे उपयुक्त होगा। यह सुनना दिलचस्प होगा कि समस्या के लिए आपका पाइथोनिक दृष्टिकोण क्या होगा।

    उत्तर

    10

    आपको एक नया आउटपुट फ़ंक्शन परिभाषित करके अब और हमेशा के लिए अपनी समस्या का समाधान करना चाहिए। एक समारोह मुद्रित थे, यह बहुत आसान होता।

    मैं एक नया उत्पादन समारोह लेखन सुझाव है, संभव के रूप में आधुनिक प्रिंट समारोह हस्ताक्षर के रूप में ज्यादा mimicing (क्योंकि एक अच्छा इंटरफ़ेस पुन: उपयोग अच्छा है), उदाहरण के लिए:

    def output(*items, end="\n", file=sys.stdout): 
        pass 
    

    एक बार जब आप सभी प्रिंट जगह ले ली है प्रश्न, अब आपको यह समस्या नहीं है - आप हमेशा इसके बजाय अपने कार्य के व्यवहार को बदल सकते हैं! यह एक बड़ा कारण है कि प्रिंट को पायथन 3 में एक फ़ंक्शन क्यों बनाया गया था - क्योंकि पायथन 2.x में, "सभी" प्रोजेक्ट हमेशा मंच के माध्यम से जाते हैं जहां सभी print कथन अब लचीला नहीं होते हैं, और कोई आसान तरीका नहीं है।

    +7

    +1: स्थायी रूप से 'प्रिंट' हटाएं। इसे डीबगिंग टूल के रूप में सोचें, न कि उत्पादन कोड का वास्तविक हिस्सा। –

    8

    (लेकर सुनिश्चित नहीं हैं/अगर यह आवरण आप उपयोग करना चाहते के साथ फिट बैठता है, लेकिन मामले में ...)

    अजगर 2.6 (और कई पूर्ववर्ती संस्करण) में, आप नई पंक्ति एक अल्पविराम जोड़कर दबाने कर सकते हैं प्रिंट बयान के अंत में के रूप में है:

    data = 'some msg\r\n' 
    print data, # note the comma 
    

    इस दृष्टिकोण का उपयोग करने का नकारात्मक पक्ष यह है तथापि कि प्रिंट वाक्य रचना और व्यवहार python3 में बदल जाता है।

    0

    मुझे लगता है कि मैं एक विरासत फ़ाइल/स्ट्रीम क्लास में writeline को एक नया फ़ंक्शन परिभाषित करता हूं और print के बजाय writeline का उपयोग करने के लिए कोड अपडेट करता हूं। फ़ाइल ऑब्जेक्ट स्वयं लाइन समाप्ति शैली को सदस्य के रूप में रख सकता है। इससे आपको व्यवहार में कुछ लचीलापन मिलना चाहिए और f.write(text+line_end) के विपरीत कोड को थोड़ा स्पष्ट यानी f.writeline(text) भी बनाना चाहिए।

    4

    python2.x में, मुझे लगता है कि आप कर सकते हैं:

    print >>f "some msg\r\n", 
    

    नई लाइन अनुगामी को दबाने के लिए।

    python3.x में, यह बहुत आसान है:

    print("some msg", end = "\r\n", file = f) 
    
    0

    मैं भी अपने तीसरे समाधान पसंद करते हैं, लेकिन f.write उपयोग करने की आवश्यकता, किसी भी उपयोगकर्ता लिखा समारोह/प्रतिदेय करना होगा। इस प्रकार अगले परिवर्तन आसान हो जाएंगे। यदि आप किसी ऑब्जेक्ट का उपयोग करते हैं तो आप इसके अंदर लक्ष्य फ़ाइल को भी छुपा सकते हैं इस प्रकार फ़ाइल या न्यूलाइन की तरह कुछ वाक्यविन्यास शोर को हटा सकते हैं।

    बहुत खराब प्रिंट पायथन 2.x में एक कथन है, जिसमें पायथन 3.x प्रिंट को उपयोगकर्ता द्वारा परिभाषित कुछ उपयोगकर्ता द्वारा अधिभारित किया जा सकता है।

    0

    पायथन में ईमेल और http शीर्षलेखों को एक आसान अनुपालन तरीके से संभालने के लिए दोनों मॉड्यूल हैं। मेरा सुझाव है कि आप पहले से हल की गई समस्याओं को हल करने के बजाय उन्हें उपयोग करें।

    +0

    +1 अच्छा सुझाव, लेनार्ट। हम सभी ने "मौजूदा कोड का लाभ उठाने" के प्रयास में ओपी को "हास्य" दिया, लेकिन उसकी स्थिति के आधार पर, आप सही हैं, हमें हमेशा इन "शामिल बैटरी" के बारे में याद रखना चाहिए " – mjv

    +1

    हम वास्तव में उन लोगों से प्राप्त कक्षाओं का उपयोग कर रहे हैं stdlib ईमेल पैकेज में। उदाहरण के लिए ईमेल। जनरेटर (पायथन 2.4) भारी प्रिंट का उपयोग करता है >>। यह ईमेल के लिए अच्छा और अच्छा है (केवल \ n) की आवश्यकता है, लेकिन हम HTTP अनुरोध को पार्स, संशोधित और पुन: उत्पन्न करने के लिए भी कोड का उपयोग कर रहे हैं (जिसे \ r \ n की आवश्यकता है)। – brotchie

    +0

    आप http अनुरोध उत्पन्न करने के लिए ईमेल मॉड्यूल का उपयोग कर रहे हैं? कोई आश्चर्य नहीं कि आपको समस्याएं आती हैं। –