空格還是Tab?用Vim寫Python縮進(jìn)的正確姿勢

首先討論一下Tab和空格。

在硅谷第三季中,Richard因?yàn)橛肨ab還是空格的問題和本來情投意合的女孩吵架,甚至于決裂。很多人會覺得這是調(diào)侃程序員為了一些毫無意義的小事情“站隊(duì)”,強(qiáng)迫癥。

事實(shí)上,對于程序員來說,其實(shí)Tab和空格遠(yuǎn)遠(yuǎn)不只是“立場”問題那么簡單。

眾所周知,Tab在ASCII碼中,編碼是9,而空格是32。這也就是說,當(dāng)我們按下一個(gè)Tab的時(shí)候,即使它看起來就是8個(gè)空格(或者4個(gè)空格,不同的環(huán)境下,Tab可能顯示的效果不同),對于電腦來說,卻是完全不一樣的東西。這也意味著,對于用字符來描述過程的代碼來說,極有可能會是決定性的差異。

尤其是對于一門用空格縮進(jìn)來區(qū)分代碼層次的語言——Python。
我們來看一段代碼。

1 class MyForm(Form):
2     value1 = StringField('value1')
3     value2 = StringField('value2')
4     value3 = StringField('value3')        #這行用的是Tab縮進(jìn)
5     submit = SubmitField('Submit')

看起來這個(gè)value3變量和其他的變量沒有什么不同,然而卻出現(xiàn)了這樣的報(bào)錯(cuò)——縮進(jìn)錯(cuò)誤。

    value3 = StringField('value3')
    ^
IndentationError: unexpected indent

其實(shí)Python并沒有強(qiáng)制要求你用Tab縮進(jìn)或者用空格縮進(jìn),甚至空格按幾個(gè)都沒有強(qiáng)制要求(但在PEP8中建議了使用4個(gè)空格作為縮進(jìn):https://www.python.org/dev/peps/pep-0008/),但是卻絕對!絕對不能混用Tab和空格,那么這里,是不是空格和Tab的區(qū)別就顯得很大了呢?

這個(gè)時(shí)候有的童鞋就要說了,我用PyCharm(或者其他IDE)怎么從來都沒有出現(xiàn)這樣的問題呢?

其實(shí),很多IDE對Tab鍵做了各種各樣的優(yōu)化,其中有一條就是,將Tab鍵展開為為空格,也就是說,當(dāng)你按下Tab的時(shí)候,IDE實(shí)際上幫你把一個(gè)「9」轉(zhuǎn)換成了四個(gè)(或者八個(gè))「32」。但是要注意,不是所有的IDE都幫你做了這樣的工作!同理,對于好純潔好不做作的編輯器Vim來說,肯定也不會幫你做這樣的工作了。

既然Tab在不同的環(huán)境下展現(xiàn)不一樣,而空格卻永遠(yuǎn)都是一樣的。對于一些細(xì)致排版縮進(jìn)來說(比如說想把每一行的注釋都對齊),用空格也更加精確。這樣看起來,確實(shí)是用空格來寫代碼要好于用Tab呢。

可是每次縮進(jìn)都要按好多下空格好煩!難道要拋棄用Vim轉(zhuǎn)投各種IDE嗎?

其實(shí),只要掌握好正確的姿勢,在使用前配置好.vimrc,就可以玩轉(zhuǎn)Tab啦。

下面結(jié)合具體屬性來講解。

set shiftwidth=4 "這個(gè)量是每行的縮進(jìn)深度,一般設(shè)置成和tabstop一樣的寬度"
set tabstop=4 "設(shè)置Tab顯示的寬度,Python建議設(shè)置成4"

"剛才說過Tab和空格是不同的,雖然你可以在自己的代碼中全部使用Tab"
"但是如果你將你的代碼分享給使用空格的朋友,就會帶來很多麻煩"
"那么設(shè)置下面這行就可以將Tab自動展開成為空格"
set expandtab
"如果只想在Python文件中將Tab展開成空格,就改換成下面這句"
autocmd FileType python set expandtab

"上面的一些配置已經(jīng)可以讓你避免編譯出現(xiàn)錯(cuò)誤的問題了"

"不過下面還有一些配置是建議同學(xué)們根據(jù)需要加上的"
set smartindent "智能縮進(jìn)"
set cindent "C語言風(fēng)格縮進(jìn)"
set autoindent "自動縮進(jìn)"


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容