2013-05-24 6 views
8

मैं शून्य अक्षर ("\ x00") के साथ एक स्ट्रिंग पैड करना चाहता था। मुझे ऐसा करने के कई तरीके पता हैं, इसलिए कृपया विकल्पों के साथ जवाब न दें। मैं क्या जानना चाहता हूं: क्यों पाइथन का string.format() फ़ंक्शन नल के साथ पैडिंग की अनुमति नहीं देता है?" x00" के साथ पाइथन का string.format पैड क्यों नहीं हो सकता है?

टेस्ट मामलों:

>>> "{0:\x01<10}".format("bbb") 
'bbb\x01\x01\x01\x01\x01\x01\x01' 

यह दिखाता है कि हेक्स-भाग निकले पात्रों सामान्य रूप में काम करते हैं।

>>> "{0:\x00<10}".format("bbb") 
'bbb  ' 

लेकिन "\ x00" एक स्थान ("\ x20") में बदल जाता है।

>>> "{0:{1}<10}".format("bbb","\x00") 
'bbb  ' 
>>> "{0:{1}<10}".format("bbb",chr(0)) 
'bbb  ' 

इसे करने के कुछ अन्य तरीकों की कोशिश भी कर रहा है।

>>> "bbb" + "\x00" * 7 
'bbb\x00\x00\x00\x00\x00\x00\x00' 

यह काम करता है, लेकिन string.format

>>> spaces = "{0: <10}".format("bbb") 
>>> nulls = "{0:\x00<10}".format("bbb") 
>>> spaces == nulls 
True 

अजगर स्पष्ट रूप से प्रतिस्थापन है रिक्त स्थान (chr(0x20)) के बजाय nulls (chr(0x00)) का उपयोग नहीं करता।

+4

जब आप डाउनवोट करते हैं तो कृपया एक टिप्पणी छोड़ दें ताकि मैं इस प्रश्न को बेहतर बना सकूं। मैंने अपना शोध किया है और 'लचीला' और कार्य को पूरा करने के अन्य तरीकों के बारे में पता है। मैं जानना चाहता हूं कि क्यों पाइथन 2.7 इस तरह से व्यवहार करता है। – bonsaiviking

+0

'प्रिंट "बीबीबी" + "\ x00" * 7' का प्रयोग करें और आपको 7 रिक्त स्थान के साथ एक स्ट्रिंग मिल जाएगी। शेल हमेशा एक स्पेस कैरेक्टर के रूप में "\ x00" प्रिंट करता है। प्रिंट खोल के बिना स्ट्रिंग का 'repr' संस्करण देता है। –

उत्तर

0

क्योंकि Python2.7 में string.format विधि Python3 string.format से एक बैक पोर्ट है। पायथन 2.7 यूनिकोड पायथन 3 स्ट्रिंग है, जहां पायथन 2.7 स्ट्रिंग पायथन 3 बाइट्स है। Python3 में बाइनरी डेटा व्यक्त करने के लिए एक स्ट्रिंग गलत प्रकार है। आप बाइट्स का उपयोग करेंगे जिसमें कोई प्रारूप विधि नहीं है। तो वास्तव में आपको पूछना चाहिए कि 2.7 में स्ट्रिंग पर format विधि क्यों है, जब यह वास्तव में केवल यूनिकोड प्रकार पर होनी चाहिए क्योंकि यह Python3 में स्ट्रिंग बन गया है।

जो मुझे लगता है कि उत्तर यह है कि इसे वहां रखना बहुत सुविधाजनक है।

एक संबंधित बात क्यों format on bytes अभी तक

+0

यह वही परिणाम उत्पन्न करता है: 'u "{0: \ x00 <10}" प्रारूप (u "bbb") '। स्रोत कोड दिखाता है कि यूनिकोड और स्ट्रिंग प्रकार एक ही फॉर्मेटर का उपयोग करते हैं। – bonsaiviking

+0

@ bonsaiviking हाँ, बिंदु यह है कि '.format' बाइनरी डेटा के लिए नहीं है और बाइनरी डेटा के लिए उपयोग नहीं किया जाना चाहिए। बाइनरी डेटा के लिए यूनिकोड विधि का उपयोग करने की कोशिश कर रहा है अच्छी तरह से काम नहीं करेगा। – cmd

4

नहीं है पायथन 2.7 के लिए स्रोत कोड में खुदाई के रूप में, मैंने पाया है कि इस मुद्दे को ./Objects/stringlib/formatter.h से इस खंड में है, लाइनों 718-722 (संस्करण 2.7.3 में) :

/* Write into that space. First the padding. */ 
p = fill_padding(STRINGLIB_STR(result), len, 
       format->fill_char=='\0'?' ':format->fill_char, 
       lpad, rpad); 

दिक्कत यह है कि एक शून्य/बातिल चरित्र ('\0') एक डिफ़ॉल्ट के रूप में जब कोई पैडिंग चरित्र निर्दिष्ट किया जाता है प्रयोग किया जा रहा है। यह इस व्यवहार को सक्षम करने के लिए है:

>>> "{0:<10}".format("foo") 
'foo  ' 

यह ./Objects/stringlib/formatter.h:186 पर format->fill_char = ' ';parse_internal_render_format_spec() में डिफ़ॉल्ट के रूप में स्थापित करने के लिए संभव हो सकता है, लेकिन वहाँ है कि '\0' के लिए बाद में जाँच करता है पश्च संगतता के बारे में कुछ बिट है। किसी भी मामले में, मेरी जिज्ञासा संतुष्ट है। अगर किसी और के पास इतिहास है या इसके लिए बेहतर स्पष्टीकरण है तो मैं किसी और के जवाब को स्वीकार करूंगा।

2

मूल प्रश्न का उत्तर यह है कि यह अजगर में एक बग था।

इसे अनुमति के रूप में दस्तावेज किया गया था, लेकिन नहीं था। यह 2014 में तय किया गया था। पायथन 2 के लिए, फिक्स पहले 2.7.7 या 2.7.8 में दिखाई दिया (मुझे यकीन नहीं है कि कौन सी बताना है)

मूल ट्रैक issue

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