2016-12-06 8 views
7

के बारे में अजगरअजगर खुला() बनाम .close()

में वाक्य रचना क्यों हम open("file") का उपयोग खोलने के लिए, लेकिन यह बंद करने के लिए नहीं "file".close() करते हैं?
यह "file".open() या उलटा close("file") क्यों नहीं है?

+1

यह एक शैली की बात है। किसी ऑब्जेक्ट के साथ काम करने वाले फ़ंक्शंस आमतौर पर उस ऑब्जेक्ट के तरीके होते हैं, लेकिन आपको ऑब्जेक्ट को पहली जगह बनाने का एक तरीका चाहिए ... –

+2

'file" .open() '* मुझे गलत लगता है * - सभी तार नहीं हैं वैध फाइलें खोलने के लिए, इसलिए 'str.open() 'होने पर बस खराब डिज़ाइन की तरह लगता है, जबकि सभी तारों को' विभाजित()' आदि – Aurora0001

+1

यह '"फ़ाइल नहीं है .close()', इसलिए' "फ़ाइल" .open() 'मेल नहीं खाएगा। मुझे लगता है कि यह आसानी से 'बंद (file_object) 'हो सकता था। – user2357112

उत्तर

1

केवल आपके से थोड़ा कम नया है, लेकिन मैं इसे एक जाने दूंगा, मूल रूप से खोलना और बंद करना अजगर जैसी भाषा में बहुत अलग कार्य हैं। जब आप फ़ाइल को खोल रहे हैं तो आप वास्तव में क्या कर रहे हैं, जो आपके एप्लिकेशन के भीतर काम करने के लिए एक ऑब्जेक्ट बना रहा है जो फ़ाइल का प्रतिनिधित्व करता है, इसलिए आप इसे एक ऐसे फ़ंक्शन के साथ बनाते हैं जो ओएस को सूचित करता है कि फ़ाइल खोला गया है और एक ऑब्जेक्ट बनाता है जो पायथन कर सकता है फ़ाइल को पढ़ने और लिखने के लिए उपयोग करें। जब फ़ाइल को बंद करने का समय आता है तो मूल रूप से क्या करने की आवश्यकता होती है, यह आपके ऐप को ओएस को बताने के लिए है कि यह फ़ाइल के साथ किया जाता है और उस ऑब्जेक्ट का निपटान करता है जो फ़ाइल के लिए फ़ाइल का प्रतिनिधित्व करता है, और ऐसा करने का सबसे आसान तरीका है ऑब्जेक्ट पर एक विधि। यह भी ध्यान रखें कि "file".open जैसे सिंटैक्स को स्ट्रिंग प्रकार की फ़ाइलों को खोलने के तरीकों को शामिल करने की आवश्यकता होगी, जो एक बहुत ही अजीब डिज़ाइन होगा और स्ट्रिंग प्रकार पर बहुत सारे एक्सटेंशन की आवश्यकता होगी, जिसे आप उस वाक्यविन्यास के साथ कार्यान्वित करना चाहते हैं। close(file) थोड़ा और अधिक समझ में आएगा लेकिन फिर भी उस ऑब्जेक्ट को रिलीज़ करने का एक गुंजाइश तरीका होगा/ओएस को यह बताएगा कि फ़ाइल अब खुला नहीं है, और आप एक वैरिएबल file पास कर रहे ऑब्जेक्ट का प्रतिनिधित्व करते हैं जब आपने फ़ाइल खोल दी थी स्ट्रिंग फ़ाइल के पथ पर इशारा करते हुए।

+1

मेरे पास कुछ स्पष्टीकरण हैं जो मैं आपकी व्याख्या में करना चाहता हूं: 'ओपन' फ़ंक्शन आपकी फ़ाइल को स्मृति में नहीं पढ़ता है। 'पढ़ें' और 'रीडलाइन' ऐसा करते हैं। साथ ही, आपके द्वारा खोले गए किसी भी फाइल पर "लॉक" जरूरी नहीं है। यह इस बात पर निर्भर करता है कि ऑपरेटिंग सिस्टम खुले फ़ाइल संदर्भों को कैसे संभालता है। मैं समझता हूं कि आपका क्या मतलब है, लेकिन मैं "लॉक" शब्द का उपयोग करने से बचूंगा। – skrrgwasme

+0

धन्यवाद! मेरी एमएस पृष्ठभूमि वहां से दिख रही थी और मैं इस बारे में भूल गया कि कुछ ओएस के हैंडल खुले फ़ाइल हैंडल कैसे करते हैं। वास्तव में स्पष्टीकरण की सराहना करते हैं और मैंने अपना जवाब अपडेट कर लिया है। –

8

ऐसा इसलिए है क्योंकि open() एक फ़ंक्शन है, और .close() एक ऑब्जेक्ट विधि है। "file".open() समझ में नहीं आता है, क्योंकि आप यह कह रहे हैं कि open() फ़ंक्शन वास्तव में स्ट्रिंग "file" स्ट्रिंग का एक वर्ग या उदाहरण विधि है। सभी तार वैध फाइल या डिवाइस खोले जाने के लिए नहीं हैं, तो दुभाषिया को "not a file-like device".open() को संभालने के लिए कैसे संदिग्ध होगा। हम इसी कारण से "file".close() का उपयोग नहीं करते हैं।

close("file") फ़ाइल नाम की एक लुकअप की आवश्यकता होगी, फिर उस फ़ाइल से जुड़ी वर्तमान प्रक्रिया के स्वामित्व वाले फ़ाइल हैंडल देखने के लिए एक और लुकअप होगा। यह बहुत अक्षम होगा और संभवतः छिपे हुए नुकसान होंगे जो इसे अविश्वसनीय बना देगा (उदाहरण के लिए, यदि यह फ़ाइल नहीं है, लेकिन इसके बजाय एक TTY डिवाइस है?)। खुली फ़ाइल या डिवाइस का संदर्भ रखने के लिए यह बहुत तेज और सरल है और उस संदर्भ के माध्यम से फ़ाइल को बंद करें (जिसे हैंडल भी कहा जाता है)।

कई भाषाओं यह तरीका अपनाते हैं:

f = open("file") # open a file and return a file object or handle 
# stuff... 
close(f)   # close the file, using the file handle or object as a reference 

यह आपके close("file") निर्माण के समान दिखता है, लेकिन मूर्ख नहीं बनाया जा है: यह इसके लिए एक सीधा संदर्भ, फ़ाइल का नाम नहीं के माध्यम से फ़ाइल को बंद करने की है में संग्रहीत के रूप में एक स्ट्रिंग।

पायथन डेवलपर्स ने वही काम करना चुना है, लेकिन यह अलग दिखता है क्योंकि उन्होंने इसे ऑब्जेक्ट उन्मुख दृष्टिकोण के साथ लागू किया है। इस का कारण का हिस्सा है कि अजगर फ़ाइल have a lot of methods उन्हें उपलब्ध वस्तुओं है इस तरह के read(), flush(), seek(), आदि के रूप यदि हम close(f) इस्तेमाल किया, तो हम या तो करने के लिए सभी फाइल वस्तु तरीकों में से बाकी के परिवर्तन होगा फ़ंक्शंस, या इसे एक यादृच्छिक फ़ंक्शन दें जो किसी भी अच्छे कारण के लिए बाकी से भिन्न व्यवहार करता है।

टी एल; डॉ
open() और file.close() के डिजाइन OOP प्रधानाचार्यों और अच्छा फ़ाइल संदर्भ प्रक्रियाओं के संगत है।open() एक फैक्ट्री-जैसी फ़ंक्शन है जो ऑब्जेक्ट बनाता है जो फ़ाइलों या अन्य उपकरणों का संदर्भ देता है। ऑब्जेक्ट बनने के बाद, उस ऑब्जेक्ट पर अन्य सभी ऑपरेशन कक्षा या इंस्टेंस विधियों के माध्यम से किए जाते हैं।

1

आम तौर पर आपको "file".close() का उपयोग स्पष्ट रूप से नहीं करना चाहिए, लेकिन संदर्भ के रूप में open(file) का उपयोग करें ताकि अपवाद होने पर फ़ाइल हैंडल भी बंद हो। समस्या का अंत :-)

लेकिन वास्तव में आपके प्रश्न का उत्तर देने के लिए मुझे लगता है कि open कई विकल्पों का समर्थन करता है और लौटा वर्ग इन विकल्पों के आधार पर भिन्न होता है (io module भी देखें)। इसलिए यह अंत उपयोगकर्ता को याद रखने के लिए बस इतना जटिल होगा कि वह कौन सी कक्षा चाहता है और फिर सही वर्ग के साथ "class".open का उपयोग करें। ध्यान दें कि आप फ़ाइल के पूर्णांक फ़ाइल डिस्क्रिप्टर को लपेटने के लिए भी पास कर सकते हैं। " open पर, इसका मतलब यह होगा कि str.open() विधि के अलावा आपको int.open() भी मिल जाएगा। यह वास्तव में बुरा ओओ डिजाइन होगा लेकिन भ्रमित भी होगा। मुझे लगता है कि क्या सवाल की तरह है कि ("door".open(), (1).open()) के बारे में StackOverflow पर कहा जाएगा परवाह नहीं करेंगे ...

हालांकि मैं मानता चाहिए एक pathlib.Path.open समारोह नहीं है। लेकिन अगर आपके पास पथ है तो यह अब अस्पष्ट नहीं है।

close() फ़ंक्शन के रूप में: प्रत्येक इंस्टेंस में close() विधि पहले से ही होगी और विभिन्न वर्गों के बीच कोई अंतर नहीं है, तो अतिरिक्त फ़ंक्शन क्यों बनाएं? बस कोई फायदा नहीं है।

1

जो कहा गया है, इसके अलावा, मैंने पाइथन में चेंजलॉग को file प्रकार में निर्मित करने के लिए उद्धृत किया है। यह (संक्षिप्त) बताता है कि क्यों वर्ग निर्माता file प्रकार (अजगर 2 में उपलब्ध) का उपयोग दृष्टिकोण अजगर 3 में हटा दिया गया था:

फ़ाइल प्रकार निकाला गया। खुला() का प्रयोग करें। अब कई अलग-अलग प्रकार की धाराएं हैं जो ओओ मॉड्यूल में वापस आ सकती हैं।

मूल रूप से, जबकि file("filename")file का एक उदाहरण बन जाएगा, open("filename") अलग धारा वर्गों के उदाहरण मोड के आधार पर लौट सकते हैं,।

https://docs.python.org/3.4/whatsnew/3.0.html#builtins

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