2010-01-09 17 views
26

मैंने तय की, कि मैं थोड़ा पाइथन सीखता हूं। पहला परिचय कहता है कि यह समूह विवरणों में इंडेंटेशन का उपयोग करता है। जबकि सबसे अच्छी आदत स्पष्ट रूप से इनमें से एक का उपयोग करने के लिए स्पष्ट है, तो क्या होता है यदि मैं उन्हें बदलता हूं? एक टैब के बराबर कितने रिक्त स्थान माना जाएगा? या टैब और रिक्त स्थान मिश्रित होने पर यह बिल्कुल काम करने में असफल रहेगा?पायथन की टैब और रिक्त स्थान की व्याख्या

उत्तर

32

रिक्त स्थान टैब के बराबर नहीं माना जाता है। एक टैब के साथ इंडेंट की गई रेखा 1, 2, 4 या 8 रिक्त स्थान के साथ इंडेंट की गई रेखा से अलग इंडेंटेशन पर है। जवाबी उदाहरण के द्वारा

पत्र (! गलत, या, पर सबसे अच्छा, सीमित - टैब = 4 रिक्त स्थान):

x = 1 
if x == 1: 
^Iprint "fff\n" 
    print "yyy\n" 

'^I' एक टैब को दर्शाता है। जब अजगर 2.5 के माध्यम से चलाने के लिए, मैं त्रुटि मिलती है:

File "xx.py", line 4 
    print "yyy\n" 
       ^
IndentationError: unindent does not match any outer indentation level 

इस प्रकार अजगर 2.5 में दिखा रहा है कि, टैब रिक्त स्थान (और विशेष रूप से नहीं के बराबर करने के लिए 4 रिक्त स्थान) के बराबर नहीं हैं।


ओह - शर्मनाक; काउंटर-उदाहरण द्वारा मेरा सबूत दिखाता है कि टैब 4 रिक्त स्थान के बराबर नहीं हैं। Alex Martellicomment में पॉइंटन 2 में इंगित करते हैं, टैब 8 रिक्त स्थान के बराबर हैं, और एक टैब और 8 रिक्त स्थान के साथ उदाहरण को अनुकूलित करने से पता चलता है कि यह वास्तव में मामला है।

x = 1 
if x != 1: 
^Iprint "x is not 1\n" 
     print "y is unset\n" 

पायथन 2 में, यह कोड कुछ भी प्रिंट नहीं करता है।


अजगर 3 में, नियम थोड़े अलग हैं (notedAntti Haapala द्वारा के रूप में)। की तुलना करें:

अजगर 2 का कहना है:

First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

अजगर 3 का कहना है:

Tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

(खोलने wor के अलावा d "सबसे पहले," इन एक जैसे हैं)

अजगर 3 एक अतिरिक्त पैरा जोड़ता है:।

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

इसका मतलब है कि टैब बनाम 8 अंतरिक्ष उदाहरण है कि अजगर 2 में काम में एक TabError उत्पन्न होगा पायथन 3. यह सर्वोत्तम है - पायथन 3 में आवश्यक - यह सुनिश्चित करने के लिए कि ब्लॉक में प्रत्येक पंक्ति पर इंडेंटेशन बनाने वाले वर्णों का अनुक्रम समान है। PEP8 कहता है 'प्रति इंडेंटेशन स्तर पर 4 रिक्त स्थान का उपयोग करें'। (Google के कोडिंग मानकों का कहना है कि '2 रिक्त स्थान का उपयोग करें'।)

+9

दुर्भाग्यवश, टैब को रिक्त स्थान के बराबर माना जाता है - विशेष रूप से, आठ रिक्त स्थान, क्योंकि दस्तावेज़ काफी स्पष्ट रूप से कहते हैं। कभी भी टैब और रिक्त स्थान को मिश्रण करना सर्वोत्तम अभ्यास नहीं है, लेकिन आपको सर्वोत्तम अभ्यास के उल्लंघन के लिए चेतावनियां (या त्रुटियों) प्राप्त करने के लिए '-t' (या' -tt') के साथ पायथन चलाने की आवश्यकता है। –

+5

[पायथन भाषा संदर्भ] (http://docs.python.org/2/reference/lexical_analysis.html#indentation) कहता है: 'पहला, टैब प्रतिस्थापित किया गया है (बाएं से दाएं) एक से आठ स्थानों तक कि प्रतिस्थापन तक और इसमें वर्णों की कुल संख्या आठ में से एक है (यह यूनिक्स द्वारा उपयोग किए जाने वाले समान नियम होने का इरादा है)। पहले गैर-रिक्त वर्ण से पहले की रिक्त स्थान की कुल संख्या तब रेखा के इंडेंटेशन ' – gkcn

+0

को निर्धारित करती है, और यह उत्तर केवल ** पायथन 2 ** पर लागू होता है। –

2

4 रिक्त स्थान एक टैब (मेरे सेटअप में) है, लेकिन जहां तक ​​मुझे पता है, वे इंटरचेंज नहीं हैं। आप या तो रिक्त स्थान या टैब का उपयोग कर सकते हैं। दोनों नहीं

+2

आवश्यक नहीं है। यह आपके सेटअप पर निर्भर करता है। –

5

बस उन्हें इंटरचेंज न करें :)
"आईडी" दबाकर 4 रिक्त स्थान इनपुट करने के लिए अपना आईडीई/संपादक सेट करें और आप जाने के लिए अच्छे हैं।

5

मैं आपको सलाह दूंगा कि आप http://www.python.org/dev/peps/pep-0008/ पर जाएं जो पाइथन कोड के लिए 'आधिकारिक' पायथन शैली मार्गदर्शिका है। इसमें टैब/रिक्त स्थान का उपयोग शामिल है (अन्य चीजों के साथ)।

18

पायथन शैली के लिए PEP 8 का पालन करें। पीईपी 8 कहते हैं: इंडेंटेशन

Use 4 spaces per indentation level.

For really old code that you don't want to mess up, you can continue to use 8-space tabs.

टैब या रिक्त स्थान?

Never mix tabs and spaces.

The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture of tabs and spaces should be converted to using spaces exclusively. When invoking the Python command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!

+0

वर्तमान लिंक यह है: http://legacy.python.org/dev/peps/pep-0008/ plz उत्तर को अपडेट करने पर विचार करें। धन्यवाद – kmonsoor

-1

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

Here टैब बनाम रिक्त स्थान के बारे में क्लासिक आलेख है - मैं अपने स्वयं के .emacs फ़ाइल में jwz के elisp का एक संस्करण उपयोग करता हूं।

(मैं व्यक्तिगत रूप से केवल 2 पात्रों के खरोज का उपयोग करके पीईपी 8 के साथ तोड़ने के लिए कबूल - 4 अक्षर एक बहुत है जब आपके लाइनों केवल 80 अक्षर हैं ...)

8

अजगर 2 में, टैब की व्याख्या ऐसा लगता है कि इसे 8-स्पेस टैब स्टॉप का उपयोग करके रिक्त स्थान में परिवर्तित किया गया है (जैसा कि पहले के उत्तरों द्वारा पहले से प्रदान किया गया है); Python 3 mixing of spaces and tabs are always an error में - - टैब केवल वे टैब और रिक्त स्थान ही मैच से मेल खाते हैं कि कि प्रत्येक टैब 1 से 8 रिक्त स्थान से खरोज आगे इतना है कि जिसके परिणामस्वरूप खरोज 8.

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

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

आईईएल्गोरिथ्म इस प्रकार काम करता है:

  • टैब और रिक्त स्थान की संख्या के दोनों संख्या पिछले लाइन (कोई फर्क नहीं पड़ता आदेश) से मेल खाती है, तो यह लाइन पिछले लाइन के साथ एक ही ब्लॉक के अंतर्गत आता है

  • अगर (टैब, रिक्त स्थान) में से एक की संख्या पिछली लाइन और अन्य की संख्या पर से अधिक है कम से कम पिछले लाइन पर लोगों के बराबर है, यह एक दांतेदार ब्लॉक

  • टपल (tabs, spaces) मैचों है पिछले ब्लॉक से एक इंडेंट - वें उस ब्लॉक को

  • अन्यथा IndentationError या TabError उठाया गया है।

यही कारण है कि टैब और रिक्त स्थान मिश्रण, या यहाँ तक खरोज के लिए टैब का उपयोग बिल्कुल अजगर में एक बहुत ही बुरा व्यवहार पर विचार किया जाएगा है।

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