2016-05-22 54 views
1

我一直在閱讀PEP 8,但我不明白爲什麼Python3會在這個錯誤信息中挑出混合標籤和空格。爲什麼混合製表符和空格而不是其他PEP8違規?

TabError: inconsistent use of tabs and spaces in indentation

我明白了一致性的重要性,但認爲暫停執行似乎偏激,特別是由於混合製表符和空格不會對編譯器和最良好的編輯器支持選項卡/空間轉換任何區別的錯誤消息。最重要的是,Python3在忽略其他PEP慣例(例如使用三個空格縮進而不是四個空格)時沒有問題,您甚至不會收到警告消息。

那麼,爲什麼Python3突然間把混合空間和標籤當作最終的邪惡呢?

+0

'尤其是因爲混合的製表符和空格對編譯器沒有任何影響。 - 從我讀過的內容來看,編譯器完全依賴'\ t'。其他空格是不一致的。 – finnrayment

+0

它不會像執行拒絕一樣「停止執行」。 :) –

回答

2

你可以很好地混合python文件中的標籤和空格(雖然PEP8說你不應該)。

(#2打印選項卡,4個空格,例如標籤是在this gist正確,測試他們自己!)

這裏是一個完全有效的Python函數:

def foo(): 
    print("one tab") # all indentation is one tab. 
    if True: 
     print("two spaces") 
    else: 
     print("four spaces") 

你不能什麼做的是同一塊混合製表符和空格

def foo(): 
    print("one tab") 
     print("eight spaces") 

這給出了TabError

即使這些排隊在您的文本編輯器。


這是因爲(大約)他們可以不同在別人的文本編輯器中排隊,看起來像一個不同的過程。舉一個愚蠢的例子:

def foo(): 
    while True: 
     "we should exit immediately" 
     return True # suppose this was tab indented 

最後一行,看起來好像沒有線與字符串,因此立即返回,但因爲它是標籤縮進也許是列隊與一段時間(所以while循環不退出)。 ???

這裏有含糊之處,所以解析器說不。


但是,PEP8說,你應該總是使用4個空格,避免這種模糊性。

+1

好吧,我想我明白了。因此,如果您編寫混合選項卡和空格代碼,其中選項卡爲4個空格,則在將其粘貼到編輯器的選項卡設置爲8個空格時,會發生錯位。這可能會導致一個沉默的錯誤,這將會毀了你的一天。謝謝。 – jmdeamer

相關問題