पायथन के स्ट्रिंग प्रारूपण के कई तरीके - क्या पुराने हैं (होने जा रहे हैं) पदावनत?


106

पायथन में स्ट्रिंग को प्रारूपित करने के कम से कम छह तरीके हैं:

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

विभिन्न तरीकों का संक्षिप्त इतिहास:

  • printf-स्टाइल फॉर्मेटिंग पाइथन शैशवावस्था से ही आसपास रही है
  • Templateवर्ग अजगर 2.4 में पेश किया गया था
  • formatविधि पायथन 2.6 में पेश किया गया था
  • fपायथन 3.6 में पेश किए गए थे

मेरे प्रश्न हैं:

  • क्या printf-स्टाइल फ़ॉर्मेटिंग को घटाया या घटाया जा रहा है?
  • में Template class, substituteविधि पदावनत है या पदावनत होने वाली है? (मैं इस बारे में बात नहीं कर रहा हूं safe_substitute, जैसा कि मैं समझता हूं कि यह अद्वितीय क्षमता प्रदान करता है)

इसी तरह के सवाल और मुझे लगता है कि वे डुप्लिकेट नहीं हैं:

यह सभी देखें


1
क्या मुझे इंगित करने की आवश्यकता है कि आप Formatterकक्षा को भूल गए हैं ?
मार्टिन पीटर्स

जवाबों:


14

हालांकि, डॉक्स में विभिन्न संकेत .formatहोते हैं और एफ-स्ट्रिंग्स तार से बेहतर %होते हैं, इसलिए उत्तरार्द्ध को कभी भी खाली करने की कोई जीवित योजना नहीं है।

कमिट इश्यू # 14123 में: स्पष्ट रूप से उल्लेख करें कि पुरानी शैली% स्ट्रिंग स्वरूपण में कोट्स हैं, लेकिन जल्द ही कोई दूर नहीं जा रहा है। , इश्यू से प्रेरित है कि% प्रिंटफ -शैली प्रारूपण को चित्रित करने की कोई वर्तमान योजना नहीं है , इस वाक्यांश को समाहित करने के लिए डॉक्स -फॉर्मेटिंग को संपादित किया गया है:

चूंकि नया स्ट्रिंग-स्वरूपण सिंटैक्स अधिक लचीला है और स्वाभाविक रूप से ट्यूपल्स और शब्दकोशों को संभालता है, इसलिए इसे नए कोड के लिए अनुशंसित किया जाता है। हालाँकि, प्रिंटफ़-शैली प्रारूपण को चित्रित करने की कोई वर्तमान योजना नहीं है

(जोर मेरा)

इस वाक्यांश को बाद में हटा दिया गया था, करीब # 4966 में: आधुनिक पायथन की स्थिति को बेहतर ढंग से समझाने के लिए अनुक्रम डॉक्स को संशोधित करें । यह एक संकेत की तरह लग सकता है कि %स्वरूपण को चित्रित करने की योजना कार्ड पर वापस आ गई थी ... लेकिन बग ट्रैकर में गोता लगाने से पता चलता है कि इरादा विपरीत था। बग ट्रैकर पर, कमिट का लेखक इस तरह से बदलाव की विशेषता बताता है :

  • प्रिंट-शैली स्वरूपण और str.format विधि के बीच संबंधों का वर्णन करने वाले गद्य को बदल दिया (जानबूझकर इस निहितार्थ को हटाने कि पूर्व गायब होने का कोई वास्तविक खतरा है - यह हमारे लिए व्यावहारिक रूप से नहीं है कि हम इसे गंभीरता से मारने पर विचार करें)

दूसरे शब्दों में, हमारे पास %-फोर्मेटिंग डॉक्स में लगातार दो बदलाव किए गए हैं, जो स्पष्ट रूप से इस बात पर जोर देते हैं कि इसे हटाया नहीं जाएगा, अकेले हटा दें। डॉक्स विभिन्न प्रकार के स्ट्रिंग फॉर्मेटिंग के सापेक्ष गुणों पर %विचारित रहते हैं, लेकिन वे यह भी स्पष्ट करते हैं कि -फॉर्मेटिंग अपग्रेड या हटाए नहीं जा रहे हैं।

मार्च 2017 में उस पैराग्राफ में सबसे हालिया बदलाव क्या है , इसे इससे बदल दिया ...

यहाँ वर्णित स्वरूपण कार्य कई प्रकार की विचित्रताएँ प्रदर्शित करते हैं जो कई सामान्य त्रुटियों को जन्म देती हैं (जैसे कि टुपल्स और शब्दकोशों को सही ढंग से प्रदर्शित करने में विफल होना)। नए स्वरूपित स्ट्रिंग शाब्दिक या str.formatइंटरफ़ेस का उपयोग करने से इन त्रुटियों से बचने में मदद मिलती है। ये विकल्प स्वरूपण पाठ के लिए अधिक शक्तिशाली, लचीले और एक्स्टेंसिबल दृष्टिकोण भी प्रदान करते हैं।

... इसके लिए:

यहाँ वर्णित स्वरूपण कार्य कई प्रकार की विचित्रताएँ प्रदर्शित करते हैं जो कई सामान्य त्रुटियों को जन्म देती हैं (जैसे कि टुपल्स और शब्दकोशों को सही ढंग से प्रदर्शित करने में विफल होना)। नए स्वरूपित स्ट्रिंग शाब्दिकों का उपयोग करके, str.formatइंटरफ़ेस या टेम्पलेट स्ट्रिंग्स इन त्रुटियों से बचने में मदद कर सकते हैं। इन विकल्पों में से प्रत्येक अपने स्वयं के ट्रेड-ऑफ और सादगी, लचीलेपन और / या एक्स्टेंसिबिलिटी के लाभ प्रदान करता है।

ध्यान दें कि "से बचने में मदद करता है" से परिवर्तन "से बचने में मदद कर सकता है", और कैसे .formatऔर f- स्ट्रिंग्स की स्पष्ट सिफारिश को शराबी, समान गद्य द्वारा प्रतिस्थापित किया गया है कि कैसे प्रत्येक शैली "अपने स्वयं के व्यापार-लाभ और लाभ प्रदान करती है" । यही है, न केवल कार्ड पर एक औपचारिक पदावनति है, बल्कि वर्तमान डॉक्स खुले तौर पर स्वीकार कर रहे हैं कि %कम से कम प्रारूपण में अन्य दृष्टिकोणों पर कुछ "लाभ" हैं।

मुझे यह सब पता चल गया कि %प्रारूपण को हटाने या हटाने का आंदोलन न केवल लड़खड़ा गया है, बल्कि पूरी तरह से और स्थायी रूप से हार गया है।


2
शराबी भाषा परिवर्तन को मर्क्यूरियल मेंटेनर्स (अन्य लोगों के बीच) को जोड़ने के लिए जोड़ा गया था जो कि मर्क्यूरियल को एक कोडबेस के साथ पीछे छोड़ना नहीं चाहता था ताकि इसका उपयोग मिट जाए %। अब जबकि 'नो लार्ज स्केल कोड मॉड्स' पॉलिसी को खत्म कर दिया गया है, उनकी आपत्तियां भी फीकी पड़ रही हैं। लंबे समय में, दोनों % बिंदुओं को बनाए रखने से कुछ लाभ नहीं होगा , कुछ समय के लिए प्रिंटफ़ सिंटैक्स को हटा दिया जाएगा। हम अभी तक पता नहीं है, और इसलिए भाषा नीचे toning के लायक था।
मार्टिज़न पीटर

@MartijnPieters दिलचस्प। ऐसा लगता है कि आपके पास इस निर्णय के बारे में बहुत ज्ञान है कि मेरे पास कमी है। इसके लायक क्या है, मुझे लगता है कि आप इन बिंदुओं को रेखांकित करते हुए आपसे एक अच्छी तरह से संदर्भित जवाब (या तो एक नए उत्तर के रूप में, या अपने मौजूदा को संपादित करें) का मूल्य होगा।
मार्क अमेरी

58

नई .format()पद्धति पुराने %फॉर्मेटिंग सिंटैक्स को बदलने के लिए है । उत्तरार्द्ध को डी-जोर दिया गया है, (लेकिन आधिकारिक तौर पर अभी तक नहीं निकाला गया है )। विधि प्रलेखन के रूप में ज्यादा:

स्ट्रिंग प्रारूपण की यह विधि पायथन 3 में नया मानक है, और इसे नए कोड %में स्ट्रिंग प्रारूपण संचालन में वर्णित स्वरूपण के लिए पसंद किया जाना चाहिए

(जोर मेरा)।

पश्चगामी अनुकूलता बनाए रखने और संक्रमण को आसान बनाने के लिए, पुराने प्रारूप को अभी के लिए छोड़ दिया गया है । मूल पीईपी 3101 प्रस्ताव से :

पिछेड़ी संगतता

मौजूदा तंत्र को जगह में छोड़कर पीछे की संगतता को बनाए रखा जा सकता है। नई प्रणाली मौजूदा स्ट्रिंग प्रारूपण तकनीकों के किसी भी विधि नाम से नहीं टकराती है, इसलिए दोनों प्रणालियां तब तक सह-अस्तित्व में रह सकती हैं जब तक कि पुरानी प्रणाली को अपदस्थ करने का समय नहीं आता है।

नोट करें जब तक यह पुराने सिस्टम को अपदस्थ करने का समय नहीं आता है ; इसे पदावनत नहीं किया गया है, लेकिन जब भी आप नया कोड लिखते हैं तो नई प्रणाली का उपयोग किया जाता है ।

नई प्रणाली में एक फायदा है कि आप पुराने फॉर्मेट के टपल और डिक्शनरी दृष्टिकोण को जोड़ सकते हैं% :

"{greeting}, {0}".format(world, greeting='Hello')

और object.__format__()व्यक्तिगत मूल्यों के प्रारूपण को संभालने के लिए उपयोग किए जाने वाले हुक के माध्यम से विस्तार योग्य है ।

ध्यान दें कि पुरानी प्रणाली %और Templateवर्ग था, जहां उत्तरार्द्ध आपको अपने व्यवहार को जोड़ने या बदलने वाले उपवर्ग बनाने की अनुमति देता है। नई शैली की प्रणाली में समान आला भरने के लिए Formatterकक्षा है।

पायथन 3 ने आगे बढ़ते हुए डिप्रेशन से दूर कर दिया है, इसके बजाय आपको printfइनस्टाइल स्ट्रिंग प्रारूपण अनुभाग में चेतावनी दे रहा है :

नोट : यहाँ वर्णित स्वरूपण परिचालनों में कई प्रकार की विचित्रताएँ दिखाई देती हैं, जो कई सामान्य त्रुटियों को जन्म देती हैं (जैसे कि ट्यूपल्स और शब्दकोशों को सही ढंग से प्रदर्शित करना विफल)। नए स्वरूपित स्ट्रिंग शाब्दिक या str.format()इंटरफ़ेस का उपयोग करने से इन त्रुटियों से बचने में मदद मिलती है। ये विकल्प स्वरूपण पाठ के लिए अधिक शक्तिशाली, लचीले और एक्स्टेंसिबल दृष्टिकोण भी प्रदान करते हैं।

पायथन 3.6 ने स्वरूपित स्ट्रिंग शाब्दिकों को भी जोड़ा , जो भावों को प्रारूप के तार में जोड़ते हैं। ये प्रक्षेपित मूल्यों के साथ तार बनाने की सबसे तेज़ विधि है, और str.format()जहाँ आप शाब्दिक उपयोग कर सकते हैं, इसके बजाय इसका उपयोग किया जाना चाहिए ।


4
और आपके साथ Formatterकस्टम प्रारूप बना सकते हैं जैसे कि उन datetimeवस्तुओं का उपयोग करते हैं। इसके अतिरिक्त, क्योंकि .formatएक समारोह है, तो आप इसे और अधिक सीधे प्रतिदेय आलसी स्वरूपण बनाने के लिए उपयोग कर सकते हैं: जैसे,fmt = '{} - {}'.format; fmt(a, b)
जॉन क्लेमेंट्स

मैं यह नहीं देखता कि पुराने सिस्टमTemplate से कैसे %या किससे संबंधित है । विशेष रूप से PEP आप लिंक करते हैं, जबकि इस प्रस्ताव के बीच कुछ ओवरलैप है और string.Template, यह महसूस किया जाता है कि प्रत्येक एक विशिष्ट आवश्यकता को पूरा करता है, और यह कि एक दूसरे को कम नहीं करता है। आपके उत्तर में किसी को भ्रम हो सकता है कि Templateस्वरूपण, पुरानी प्रणाली का हिस्सा होने के कारण , पदावनत भी हो जाता है।
बकुरीउ

@ बकुरीउ: ठीक है, मुझे लगता है कि मैं उस हिस्से को याद कर रहा हूं; लेकिन मेरी राय में Formatterवर्ग उतनी ही जरूरतों को भर सकता है जितना कि string.Template()
मार्टिन पीटर्स

1
[...]should be preferred to the % formatting[...]इस भाग को प्रलेखन से हटा दिया गया है। docs.python.org/3/library/stdtypes.html#str.format
AXO

मुझे लगता है कि यह उत्तर वर्तमान में भ्रामक है; पहले पारित उद्धरण को पायथन 3 डॉक्स से हटा दिया गया है, और यह मुझे स्पष्ट रूप से स्पष्ट लगता है कि जगह लेने के लिए वंचित होने का कोई इरादा नहीं है। इस उत्तर का अभी भी ऐतिहासिक मूल्य है, लेकिन मैं किसी भी सुझाव से बचने के लिए शब्दांकन को टालना चाहूंगा जो कि अभी भी एक कार्ड में कमी है, और पिछले उत्तर में होने के लिए उत्तर के पहले आधे हिस्से को संपादित करना है। यदि आप कोई आपत्ति नहीं करते हैं तो मैं खुद ही ऐसा करूंगा, लेकिन सोचा था कि अगर आप चाहें तो आपको इस तरह के बदलाव करने का मौका देना चाहिए।
मार्क अमेरी

45

%स्ट्रिंग प्रारूपण के लिए ऑपरेटर पदावनत नहीं है, और हटाया जा करने के लिए नहीं जा रहा है - अन्य उत्तर के बावजूद।
जब भी इस विषय को पायथन विकास सूची में उठाया जाता है, तो मजबूत विवाद होता है, जिस पर बेहतर है, लेकिन क्लासिक तरीके को हटाने के लिए कोई विवाद नहीं है - यह रहेगा। PEP 3101 पर निरूपित होने के बावजूद, पायथन 3.1 आया और चला गया था, और %प्रारूपण अभी भी आसपास है।

क्लासिक शैली को रखने के लिए बयान स्पष्ट हैं: यह सरल है, यह तेज़ है, छोटी चीज़ों के लिए करना जल्दी है। .formatविधि का उपयोग करना हमेशा अधिक पठनीय नहीं होता है - और बमुश्किल कोई भी - यहां तक ​​कि कोर डेवलपर्स के बीच, .formatसंदर्भ को देखने के बिना प्रदान किए गए पूर्ण सिंटैक्स का उपयोग कर सकते हैं यहां तक ​​कि 2009 में वापस भी, एक में इस तरह के संदेश थे: http: // मेल। python.org/pipermail/python-dev/2009-October/092529.html - विषय सूची में मुश्किल से दिखा था।

2016 अपडेट

वर्तमान पायथन विकास संस्करण में (जो कि पायथन 3.6 हो जाएगा) PEP-0498 पर वर्णित स्ट्रिंग प्रक्षेप का एक तीसरा तरीका है । यह एक नया उद्धरण उपसर्ग f""(वर्तमान के अलावा u"", b""और r"") को परिभाषित करता है ।

किसी स्ट्रिंग को उपसर्ग करना f, रनटाइम पर स्ट्रिंग ऑब्जेक्ट पर एक विधि को कॉल करेगा, जो स्वचालित रूप से स्ट्रिंग को वर्तमान स्कोप से स्ट्रिंग में इंटरपोल करेगा:

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'

3
यह बहुत अच्छा है कि वे अपने स्वयं के कार्यान्वयन के प्रकारों की अनुमति दें __format__। उदाहरण के लिए, format(Decimal('0.1'), '.20f')बनाम '%.20f' % Decimal('0.1')। उत्तरार्द्ध दशमलव को एक फ्लोट के लिए मजबूर करता है।
एरिक सन

2
एनबी। मैंने तर्क नहीं दिया कि पुरानी शैली सभी मामलों में बेहतर है - बस यह छोटा है और कभी-कभी अधिक पठनीय है (और कभी-कभी नहीं)। निश्चित रूप से नया तरीका अधिक लचीला है।
jsbueno

क्या fपायथन 3 के लिए एक समान है ?
डैनियल

f-stringsजैसा कि ऊपर का इस्तेमाल किया अजगर 3.6 के रूप में भाषा में नई विशेषता है। यह पिछले संस्करणों में मौजूद नहीं है और उन पर एक सिंटैक्स त्रुटि बढ़ाएगा।
jsbueno

20

इस पर गुइडो की नवीनतम स्थिति का संकेत यहां दिया गया है:

पायथन 3.0 में नया क्या है

पीईपी 3101: स्ट्रिंग प्रारूपण के लिए एक नया दृष्टिकोण

बिल्ट-इन स्ट्रिंग फॉर्मेटिंग ऑपरेशंस के लिए एक नया सिस्टम% स्ट्रिंग फॉर्मेटिंग ऑपरेटर की जगह लेता है। (हालांकि,% ऑपरेटर अभी भी समर्थित है; इसे पायथन 3.1 में पदावनत किया जाएगा और कुछ समय बाद भाषा से हटा दिया जाएगा।) पूर्ण स्कूप के लिए पीईपी 3101 पढ़ें।

और PEP3101 ही, जिसका पिछला संशोधित डेटिंग (शुक्र, 30 सितंबर 2011) है, इसलिए उस एक के बाद देर से प्रगति नहीं हुई, मुझे लगता है।


18

पुराने पायथन डॉक्स और पीईपी 3101 को देखते हुए एक बयान था कि% ऑपरेटर को भविष्य में भाषा से हटा दिया जाएगा और हटा दिया जाएगा। निम्नलिखित बयान अजगर 3.0, 3.1, और 3.2 के लिए अजगर डॉक्स में था:

चूंकि str.format () काफी नया है, बहुत सारे पायथन कोड अभी भी% ऑपरेटर का उपयोग करते हैं। हालाँकि, क्योंकि स्वरूपण की इस पुरानी शैली को अंततः भाषा से हटा दिया जाएगा, str.format () का आमतौर पर उपयोग किया जाना चाहिए।

यदि आप Python 3.3 और 3.4 डॉक्स में एक ही सेक्शन में जाते हैं, तो आप देखेंगे कि स्टेटमेंट हटा दिया गया है। मुझे दस्तावेज में कहीं और कोई अन्य विवरण नहीं मिल सकता है जो यह दर्शाता है कि ऑपरेटर को भाषा से हटा दिया जाएगा या हटा दिया जाएगा। यह भी ध्यान रखना महत्वपूर्ण है कि PEP3101 को ढाई साल में संशोधित नहीं किया गया है (शुक्र, 30 सितंबर 2011)।

अपडेट करें

PEP461 बाइट्स और बायट्रेयर में % फ़ॉर्मेटिंग जोड़ना स्वीकार किया जाता है और इसे पायथन 3.5 या 3.6 का हिस्सा होना चाहिए। यह एक और संकेत है कि% ऑपरेटर जीवित है और लात मार रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.