2012-08-25 11 views
27

मेरे पास एक स्क्रिप्ट है जो sys.stdout.write() और sys.stderr.write() के साथ आउटपुट बनाता है। हाल ही में मैंने स्क्रिप्ट के अन्य पहलुओं के बारे में कुछ प्रश्न पोस्ट किए हैं और मैंने देखा है कि उत्तर पोस्ट करने वाले लोग print('some text', file=sys.stdout) पसंद करते हैं। आउटपुट के साथ मेरी प्राथमिक चिंता यह है कि इसे खोल द्वारा, या तो फ़ाइल में या किसी अन्य प्रोग्राम में इनपुट के रूप में पाइप किया जा सकता है। क्या कोई print() और sys.stdout.write के बीच मतभेदों को समझा सकता है (या मुझे मौजूदा स्पष्टीकरण के लिए निर्देशित कर सकता है), जिन मामलों में प्रत्येक का उपयोग किया जाना चाहिए और उन सम्मेलनों के लिए तर्कसंगत?प्रिंट() बनाम sys.stdout.write(): कौन और क्यों?

+0

[अजगर - sys.stdout.write और प्रिंट के बीच का अंतर] की संभावित डुप्लिकेट (https: //stackoverflow.com/questions/3263672/python-the-difference-between-sys-stdout-write-and-print) –

उत्तर

37

"किसी कृपया प्रिंट के बीच मतभेद() और sys.stdout.write, जिन मामलों में प्रत्येक इस्तेमाल किया जाना चाहिए और उन सम्मेलनों के लिए तर्कसंगत व्याख्या कर सकते हैं (या मुझे एक मौजूदा स्पष्टीकरण के लिए प्रत्यक्ष)? "

ठीक है मुझे लगता है कि पाइथन 3 के प्रिंट() फ़ंक्शन के बारे में आप जो मौन सुनते हैं, वह इसलिए है क्योंकि व्यावहारिक रूप से केवल एक अंतर है: उपयोग। मुझे बोली पीईपी-3105: [1]

print() के लिए हस्ताक्षर है:

डीईएफ़ प्रिंट (* args सितम्बर = '', अंत = '\ n', फ़ाइल = कोई नहीं)

की तरह एक कॉल:

प्रिंट (एक, ख, ग, फ़ाइल = sys.stderr)

आज के के बराबर होगी:

प्रिंट >> sys.stderr, एक, ख, ग

जबकि वैकल्पिक सितम्बर और अंत तर्क निर्दिष्ट क्या के बीच और तर्क के बाद क्रमश: छपा है ।

सोफ्टस्पेस सुविधा (वर्तमान में मुद्रित करने के लिए प्रयुक्त फ़ाइलों पर अर्ध-गुप्त विशेषता जो पहले आइटम से पहले एक जगह डालने के लिए मुद्रित होती है) हटा दी जाएगी।

प्रिंट "एक", प्रिंट

जो "एक" और न्यू लाइन के बीच एक रिक्ति मुद्रित नहीं होगा: इसलिए, आज के लिए एक सीधा अनुवाद नहीं किया जाएगा।

तो 2005 में [1] में समस्या के बारे में ग्विडो वैन रॉसम की चर्चा का हवाला देते हुए: प्रिंट के उपयोग में आसानी से एक अलग गैर-रैखिकता है जब आप यह तय करते हैं कि आप वस्तुओं के बीच स्थान नहीं रखना चाहते हैं; आपको या तो sys.stdout.write() का उपयोग करने के लिए स्विच करना होगा, या आपको स्ट्रिंग में सभी आइटम एकत्र करना होगा।यह एक साधारण परिवर्तन नहीं है, पर विचार क्या यह इस सरल उदाहरण में अल्पविराम से पहले रिक्त स्थान से छुटकारा पाने के लेता है:

print "x =", x, ", y =", y, ", z =", z 

यदि यह एक में निर्मित समारोह, बिल्ट-इन करने के बाद किया गया था साथी फ़ंक्शन जिसने रिक्त स्थान डालने और एक नई लाइन जोड़ने के बिना एक ही चीज़ की है, वह करने के लिए तार्किक बात होगी (या उस व्यवहार को नियंत्रित करने के लिए कीवर्ड पैरामीटर जोड़ना; लेकिन मैं दूसरा फ़ंक्शन पसंद करता हूं); लेकिन केवल प्रिंट के साथ के रूप में यह वर्तमान में खड़ा है, आप की तरह

print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z) 

या

print "x = %s, y = %s, z = %s" % (x, y, z) 

जिनमें से न तो बहुत ही आकर्षक है कुछ करने के लिए स्विच करना होगा। (और मुझे बताओ नहीं है कि रिक्त स्थान कोई बड़ी समस्या नहीं हैं - वे इस उदाहरण में नहीं हैं, लेकिन वे अन्य स्थितियों में कर रहे हैं।)


नीचे एक रविवार सुबह स्मृति लेन के लिए अच्छा प्रश्न ; यह स्पष्ट अनावश्यकता क्यों? क्योंकि यह pythonically अधिक सही उच्च स्तर के कोड लिखने के लिए:

अजगर के 7 वें ज़ेन: "पठनीयता मायने रखता है"