2012-09-25 12 views
13

एक समारोह एक पाठ फ़ाइल के नाम एक इनपुट के रूप लेता है के रूप में फ़ाइल वस्तु, मैं refactor कर सकते हैं यह बजाय एक फ़ाइल वस्तु लेने के लिए (मैं इसे "धारा" कहते हैं, वहाँ एक बेहतर शब्द है?)। फायदे स्पष्ट हैं - एक समारोह है कि एक तर्क के रूप एक धारा लेता है:फ़ाइल नाम बनाम एक समारोह तर्क

  • बहुत आसान, के लिए एक इकाई परीक्षण लिखने के बाद से मैं सिर्फ परीक्षण के लिए एक अस्थायी फ़ाइल बनाने की जरूरत नहीं है
  • अधिक लचीला, क्योंकि मैं इसे ऐसे परिस्थितियों में उपयोग कर सकता हूं जहां किसी भी तरह से पहले से ही एक चर

में फ़ाइलों की सामग्री पहले से मौजूद है, क्या धाराओं के लिए कोई नुकसान है? या क्या मुझे हमेशा फ़ाइल नाम तर्क से एक फ़ंक्शन को एक स्ट्रीम तर्क में दोबारा दोहराया जाना चाहिए (मान लीजिए, फ़ाइल केवल पाठ है)?

उत्तर

4

पायथन मानक लाइब्रेरी में कई फ़ंक्शन हैं जो दोनों को स्वीकार करते हैं - स्ट्रिंग्स जो फ़ाइल नाम या खुली फ़ाइल ऑब्जेक्ट्स हैं (मुझे लगता है कि आप "स्ट्रीम" के रूप में संदर्भित कर रहे हैं)। एक सजावट बनाने के लिए वास्तव में मुश्किल नहीं है जिसका उपयोग आप अपने कार्यों को किसी एक को स्वीकार करने के लिए कर सकते हैं। प्रभावी रूप से बदल रहा है यह राज्य है - "नदियों" का उपयोग करने के लिए

एक गंभीर दोष यह है कि आप इसे अपने कार्य करने के लिए पारित और फिर अपने समारोह से पढ़ता है। आपके कार्यक्रम के आधार पर, यदि आवश्यक हो तो उस राज्य को पुनर्प्राप्त करना गन्दा हो सकता है। (उदाहरण के लिए आप कूड़े की जरूरत हो सकती आप f.tell() और फिर f.seek() साथ कोड।)

+0

हाँ, जब मैंने कहा कि "धारा", मैं "फ़ाइल खोलने वस्तु" का मतलब है। क्या एक सजावट लिखना संभव नहीं होगा जो धारा राज्य को बचाता है और पुनर्स्थापित करता है? – max

+0

और न वहाँ एक धारा की एक सस्ती प्रतिलिपि बनाने के लिए एक तरह से, ऐसा है कि नकल, जबकि मूल धारा के "सूचक" अछूता छोड़ दिया है अपने स्वयं के "सूचक" का मालिक है? यह राज्य दृष्टिकोण को बचाने/पुनर्स्थापित करने से भी क्लीनर होगा। – max

+0

@max - निश्चित रूप से, आप ऐसा करने के लिए एक सजावट लिख सकते हैं। जब आप राज्य को पुनर्स्थापित कर रहे हों और जब आप नहीं हों तो दस्तावेज़ करना महत्वपूर्ण बात है। जहां तक ​​एक प्रतिलिपि बना रही है, केवल एक चीज जिसे मैं सोच सकता हूं वह 'itertools.tee' है, जो थोड़ा अलग है (लेकिन यह मेरे सामान्य सोने के समय से पहले है, इसलिए मैं अभी कुछ भी टाइप नहीं करता हूं: ^)। – mgilson

5

... यहाँ कैसे xml.etree.ElementTree मॉड्यूल को लागू करता है parse समारोह है:

def parse(self, source, parser=None): 
    close_source = False 
    if not hasattr(source, "read"): 
     source = open(source, "rb") 
     close_source = True 
    ... 

फ़ाइल नाम के रूप में एक स्ट्रिंग है, यह नहीं है read() विधि (यहां उस नाम की जो भी विशेषता है चेक किया गया है); हालांकि, खुली फ़ाइल में यह है। चार लाइनें शेष कोड को आम बनाती हैं। एकमात्र जटिलता यह है कि आपको याद रखना होगा कि फ़ाइल ऑब्जेक्ट को बंद करना है या नहीं (यहां source नाम दिया गया है) या नहीं। अगर यह open अंदर था, तो इसे बंद होना चाहिए। अन्यथा, इसे बंद नहीं किया जाना चाहिए।

वास्तव में, फ़ाइलों sreams से थोड़ा भिन्न होते हैं। धाराएं संभावित रूप से अनंत होती हैं जबकि आमतौर पर फ़ाइलें नहीं होतीं (जब तक कि कुछ डिवाइस मैप किए गए हों जैसे कि यह फ़ाइल थी)। प्रसंस्करण करते समय महत्वपूर्ण अंतर यह है कि आप स्ट्रीम को कभी भी स्मृति में कभी नहीं पढ़ सकते हैं। आपको इसे टुकड़ों से संसाधित करना होगा।

+0

मैं stdlib में इस पर एक संदर्भ कार्यान्वयन की तलाश में था। स्निपेट के लिए धन्यवाद यह वास्तव में समय बचाता है। यदि मैं कर सकता तो मैं भाग के लिए चेतावनी के लिए एक और +1 दूंगा। – n611x007

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