2010-09-10 12 views
5

मैंने lythda2.6:Python3.1 में कार्यात्मक तरीके से फ़ाइल बंद नहीं कर सका?

map(lambda f: f.close(), files) 

में फ़ाइल ऑब्जेक्ट्स की एक सूची को बंद करने के लिए लैम्ब्डा का उपयोग करके कोड की एक पंक्ति लिखी है, यह काम करता है, लेकिन python3.1 में नहीं है। क्यूं कर?

यहां मेरा टेस्ट कोड है:

import sys 

files = [sys.stdin, sys.stderr] 

for f in files: print(f.closed) # False in 2.6 & 3.1 

map(lambda o : o.close(), files) 

for f in files: print(f.closed) # True in 2.6 but False in 3.1 

for f in files: f.close()   

for f in files: print(f.closed) # True in 2.6 & 3.1 

उत्तर

6

map अजगर 2 में एक सूची लौटाती है, लेकिन अजगर 3. में पुनरावर्तक तो फ़ाइलें बंद कर दिया जाएगा केवल यदि आप परिणाम पर पुनरावृति:

यहाँ अपने परीक्षण कोड है।

साइड इफेक्ट्स के साथ काम करने के लिए map या समान "कार्यात्मक" फ़ंक्शन लागू न करें। पायथन एक कार्यात्मक भाषा नहीं है, और कभी नहीं होगा। एक for पाश का उपयोग करें:

for o in files: 
    o.close() 
+0

ध्यान दें कि 2to3 इसे पकड़ता है, और तत्काल मूल्यांकन को मजबूर करने के लिए स्वचालित रूप से आपके लिए मानचित्र कॉल (...) सूचीबद्ध करेगा। –

+3

'साइड इफेक्ट्स के साथ काम करने के लिए मानचित्र या समान "कार्यात्मक" फ़ंक्शंस को कभी भी लागू न करें। पायथन एक कार्यात्मक भाषा नहीं है, और कभी नहीं होगा। ' मुझे नहीं लगता कि यह क्यों अच्छी सलाह नहीं होगी, भले ही पायथन एक कार्यात्मक भाषा थी। यदि आप किसी भी भाषा में परिणाम का उपयोग नहीं करेंगे तो मानचित्र का उपयोग करने में कोई मतलब नहीं है। – sepp2k

+0

पूरी तरह से कार्यात्मक भाषाओं के कार्यों में कोई दुष्प्रभाव नहीं है, इसलिए 'बंद() 'फ़ंक्शन मौजूद नहीं हो सकता है। – Philipp

4

क्योंकि अजगर 3 में नक्शा एक आलसी इटरेटर है। the docs उद्धरण:

एक पुनरावर्तक लौटाएं जो परिणामों को उत्पन्न करने वाले हर आइटम पर फ़ंक्शन लागू करता है।

उदा। पायथन 2, map(f, seq)[f(i) for i in seq] के बराबर है, लेकिन पायथन 3 में, यह (f(i) for i in seq) है - संक्षेप में अलग वाक्यविन्यास, लेकिन बहुत अलग अर्थशास्त्र। नक्शा संस्करण काम करने के लिए, आपको इटरेटर का उपभोग करने की आवश्यकता होगी। Ergo, यह आसान है (और अधिक idiomatic: नक्शा, समझ और जेनरेटर के दुष्प्रभाव नहीं होना चाहिए!) एक स्पष्ट फॉर-लूप का उपयोग करने के लिए।

+1

मेरी राय में उन्हें अकेले 'नक्शा()' छोड़ा जाना चाहिए था और इसे अंतर्निहित इटारटोल मॉड्यूल 'imap()' विधि बना दिया जाना चाहिए था। इसके बजाय सभी 'वे' किए गए एक मौजूदा अंतर्निहित परिवर्तन को बदलकर एक और बड़ी असंगतता पेश की गई थीं। – martineau

+0

इसके अलावा, अकेले 'नक्शा()' छोड़कर और 'imap()' को अंतर्निहित बनाने के बाद "स्पष्ट रूप से स्पष्ट" स्पष्टता बेहतर है। – martineau

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