首先討論一下Tab和空格吊说。
在硅谷第三季中论咏,Richard因?yàn)橛肨ab還是空格的問(wèn)題和本來(lái)情投意合的女孩吵架,甚至于決裂颁井。很多人會(huì)覺(jué)得這是調(diào)侃程序員為了一些毫無(wú)意義的小事情“站隊(duì)”厅贪,強(qiáng)迫癥。
事實(shí)上雅宾,對(duì)于程序員來(lái)說(shuō)养涮,其實(shí)Tab和空格遠(yuǎn)遠(yuǎn)不只是“立場(chǎng)”問(wèn)題那么簡(jiǎn)單。
眾所周知眉抬,Tab在ASCII碼中贯吓,編碼是9,而空格是32吐辙。這也就是說(shuō),當(dāng)我們按下一個(gè)Tab的時(shí)候蘸劈,即使它看起來(lái)就是8個(gè)空格(或者4個(gè)空格昏苏,不同的環(huán)境下,Tab可能顯示的效果不同)威沫,對(duì)于電腦來(lái)說(shuō)贤惯,卻是完全不一樣的東西。這也意味著棒掠,對(duì)于用字符來(lái)描述過(guò)程的代碼來(lái)說(shuō)孵构,極有可能會(huì)是決定性的差異。
尤其是對(duì)于一門(mén)用空格縮進(jìn)來(lái)區(qū)分代碼層次的語(yǔ)言——Python烟很。
我們來(lái)看一段代碼颈墅。
1 class MyForm(Form):
2 value1 = StringField('value1')
3 value2 = StringField('value2')
4 value3 = StringField('value3') #這行用的是Tab縮進(jìn)
5 submit = SubmitField('Submit')
看起來(lái)這個(gè)value3變量和其他的變量沒(méi)有什么不同,然而卻出現(xiàn)了這樣的報(bào)錯(cuò)——縮進(jìn)錯(cuò)誤雾袱。
value3 = StringField('value3')
^
IndentationError: unexpected indent
其實(shí)Python并沒(méi)有強(qiáng)制要求你用Tab縮進(jìn)或者用空格縮進(jìn)恤筛,甚至空格按幾個(gè)都沒(méi)有強(qiáng)制要求(但在PEP8中建議了使用4個(gè)空格作為縮進(jìn):https://www.python.org/dev/peps/pep-0008/),但是卻絕對(duì)芹橡!絕對(duì)不能混用Tab和空格毒坛,那么這里,是不是空格和Tab的區(qū)別就顯得很大了呢?
這個(gè)時(shí)候有的童鞋就要說(shuō)了煎殷,我用PyCharm(或者其他IDE)怎么從來(lái)都沒(méi)有出現(xiàn)這樣的問(wèn)題呢屯伞?
其實(shí),很多IDE對(duì)Tab鍵做了各種各樣的優(yōu)化豪直,其中有一條就是劣摇,將Tab鍵展開(kāi)為為空格,也就是說(shuō)顶伞,當(dāng)你按下Tab的時(shí)候饵撑,IDE實(shí)際上幫你把一個(gè)「9」轉(zhuǎn)換成了四個(gè)(或者八個(gè))「32」。但是要注意唆貌,不是所有的IDE都幫你做了這樣的工作滑潘!同理,對(duì)于好純潔好不做作的編輯器Vim來(lái)說(shuō)锨咙,肯定也不會(huì)幫你做這樣的工作了语卤。
既然Tab在不同的環(huán)境下展現(xiàn)不一樣,而空格卻永遠(yuǎn)都是一樣的酪刀。對(duì)于一些細(xì)致排版縮進(jìn)來(lái)說(shuō)(比如說(shuō)想把每一行的注釋都對(duì)齊)粹舵,用空格也更加精確。這樣看起來(lái)骂倘,確實(shí)是用空格來(lái)寫(xiě)代碼要好于用Tab呢眼滤。
可是每次縮進(jìn)都要按好多下空格好煩!難道要拋棄用Vim轉(zhuǎn)投各種IDE嗎?
其實(shí)历涝,只要掌握好正確的姿勢(shì)诅需,在使用前配置好.vimrc,就可以玩轉(zhuǎn)Tab啦荧库。
下面結(jié)合具體屬性來(lái)講解堰塌。
set shiftwidth=4 "這個(gè)量是每行的縮進(jìn)深度,一般設(shè)置成和tabstop一樣的寬度"
set tabstop=4 "設(shè)置Tab顯示的寬度分衫,Python建議設(shè)置成4"
"剛才說(shuō)過(guò)Tab和空格是不同的场刑,雖然你可以在自己的代碼中全部使用Tab"
"但是如果你將你的代碼分享給使用空格的朋友,就會(huì)帶來(lái)很多麻煩"
"那么設(shè)置下面這行就可以將Tab自動(dòng)展開(kāi)成為空格"
set expandtab
"如果只想在Python文件中將Tab展開(kāi)成空格蚪战,就改換成下面這句"
autocmd FileType python set expandtab
"上面的一些配置已經(jīng)可以讓你避免編譯出現(xiàn)錯(cuò)誤的問(wèn)題了"
"不過(guò)下面還有一些配置是建議同學(xué)們根據(jù)需要加上的"
set smartindent "智能縮進(jìn)"
set cindent "C語(yǔ)言風(fēng)格縮進(jìn)"
set autoindent "自動(dòng)縮進(jìn)"