2009-09-11 8 views
33

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

"""foo 
bar 
foo2""" 

तो जब मुख्य विधि में यह दिखाई देगा:

def main(): 
    """foo 
    bar 
    foo2""" 

और स्ट्रिंग अब हर पंक्ति के आरंभ में एक अतिरिक्त टैब के लिए होता है ।

+0

http://codereview.stackexchange.com/questions/60366/avoiding-python-multiline-string-indentation –

उत्तर

0

तो अगर मैं इसे सही ढंग से मिलता है, आप ले जो कुछ उपयोगकर्ता इनपुट, यह ठीक से इंडेंट और अपने कार्यक्रम के बाकी के लिए इसे जोड़ने (और फिर है कि पूरे कार्यक्रम चलाने)।

तो जब आप अपने प्रोग्राम में उपयोगकर्ता इनपुट डालते हैं, तो आप एक रेगेक्स चला सकते हैं, जो मूल रूप से मजबूर इंडेंटेशन को वापस ले जाता है। कुछ ऐसा: तीन उद्धरणों के भीतर, सभी "नई लाइन मार्कर" को प्रतिस्थापित करें, इसके बाद चार रिक्त स्थान (या एक टैब) केवल "नई लाइन मार्कर" के साथ बदलें। मानक पुस्तकालय से

+0

हाँ, ठीक है। यही एकमात्र संभावित समाधान है जिसके साथ मैं आया हूं। यकीन नहीं है कि मैं इसके साथ आगे क्यों नहीं गया ... मुझे लगता है कि अगर कुछ भी बेहतर नहीं होता तो मुझे ऐसा करना पड़ सकता है। –

+12

@ thraxil का सुझाव textwrap.dedent का उपयोग करने का सुझाव है। अपने स्वीकृत उत्तर को बदलने पर विचार करें। –

1

एकमात्र तरीका जो मैं देखता हूं - दूसरी पंक्ति से शुरू होने वाली प्रत्येक पंक्ति के लिए पहले एन टैब को पट्टी करना है, जहां एन मुख्य विधि की पहचान ज्ञात है।

हैं कि identation पहले से ज्ञात नहीं है - आप इसे और अंतिम पंक्ति से टैब की पट्टी नंबर डालने से पहले न्यू लाइन अनुगामी जोड़ सकते हैं ...

तीसरे समाधान डेटा पार्स और बहु ​​बोली की शुरुआत को मिल रहा है और जब तक यह बंद नहीं हो जाएगा तब तक प्रत्येक पंक्ति में अपनी पहचान न जोड़ें।

सोचो वहाँ एक बेहतर समाधान ..

+0

उत्तर के लिए धन्यवाद। तो आप सुझाव दे रहे हैं कि मैंने इंडेंटेशन की प्रत्येक पंक्ति को स्ट्रिप किया है जिसे डाला गया है? मैं उलझन में हूं ... –

15

क्या एक बहु स्ट्रिंग की पहली पंक्ति इस प्रकार तार का हिस्सा है, और पार्सर द्वारा खरोज के रूप में इलाज नहीं है। आप स्वतंत्र रूप से लिख सकते हैं:

def main(): 
    """foo 
bar 
foo2""" 
    pass 

और यह सही काम करेगा।

दूसरी तरफ, यह पठनीय नहीं है, और पायथन इसे जानता है। तो यदि डॉकस्ट्रिंग में दूसरी लाइन में व्हाइटस्पेस शामिल है, तो डॉटस्ट्रिंग देखने के लिए help() का उपयोग करते समय व्हाइटसाइट की मात्रा को तोड़ दिया जाता है। इस प्रकार, help(main) और नीचे help(main2) समान सहायता जानकारी उत्पन्न करते हैं।

def main2(): 
    """foo 
    bar 
    foo2""" 
    pass 
+0

उत्तर के लिए धन्यवाद।दुर्भाग्य से इंडेंटेशन पूरी तरह से स्वचालित है, क्योंकि मेरा कोड स्क्रिप्ट (जावा में) के रूप में स्क्रिप्ट में पढ़ता है और उस स्ट्रिंग में प्रत्येक पंक्ति को इंडेंट करता है। –

+0

आह मैं देखता हूं। हालांकि मैं इसके लिए मदद का उपयोग नहीं कर सकता ... धन्यवाद हालांकि! –

79

textwrap.dedent स्वचालित रूप से निराला इंडेंटेशन को पूर्ववत करने के लिए है।

+1

साफ .. इसके बारे में नहीं पता था .. :) – Macke

+1

मानक पुस्तकालय कभी आश्चर्य की बात नहीं करता है। – thraxil

+0

बहुत अच्छी जानकारी। हालांकि मैं इसका उपयोग नहीं कर सकता। –

4

जो मैं देखता हूं, उससे बेहतर उत्तर inspect.cleandoc हो सकता है, जो कार्यात्मक रूप से textwrap.dedent करता है लेकिन textwrap.dedent की समस्याओं को भी ठीक करता है। नीचे दिए गए उदाहरण मतभेदों को दर्शाता है:

>>> import textwrap 
    >>> import inspect 
    >>> x = """foo bar 
     baz 
     foobar 
     foobaz 
     """ 
    >>> inspect.cleandoc(x) 
    'foo bar\nbaz\nfoobar\nfoobaz' 
    >>> textwrap.dedent(x) 
    'foo bar\n baz\n foobar\n foobaz\n' 
    >>> y = """ 
    ...  foo 
    ...  bar 
    ... """ 
    >>> textwrap.dedent(y) 
    '\nfoo\nbar\n' 
    >>> inspect.cleandoc(y) 
    'foo\nbar' 
संबंधित मुद्दे