首先討論一下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)"