空格还是Tab?用Vim写Python缩进的正确姿势

首先讨论一下Tab和空格。

在硅谷第三季中,Richard因为用Tab还是空格的问题和本来情投意合的女孩吵架,甚至于决裂。很多人会觉得这是调侃程序员为了一些毫无意义的小事情“站队”,强迫症。

事实上,对于程序员来说,其实Tab和空格远远不只是“立场”问题那么简单。

众所周知,Tab在ASCII码中,编码是9,而空格是32。这也就是说,当我们按下一个Tab的时候,即使它看起来就是8个空格(或者4个空格,不同的环境下,Tab可能显示的效果不同),对于电脑来说,却是完全不一样的东西。这也意味着,对于用字符来描述过程的代码来说,极有可能会是决定性的差异。

尤其是对于一门用空格缩进来区分代码层次的语言——Python。
我们来看一段代码。

1 class MyForm(Form):
2     value1 = StringField('value1')
3     value2 = StringField('value2')
4     value3 = StringField('value3')        #这行用的是Tab缩进
5     submit = SubmitField('Submit')

看起来这个value3变量和其他的变量没有什么不同,然而却出现了这样的报错——缩进错误。

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

其实Python并没有强制要求你用Tab缩进或者用空格缩进,甚至空格按几个都没有强制要求(但在PEP8中建议了使用4个空格作为缩进:https://www.python.org/dev/peps/pep-0008/),但是却绝对!绝对不能混用Tab和空格,那么这里,是不是空格和Tab的区别就显得很大了呢?

这个时候有的童鞋就要说了,我用PyCharm(或者其他IDE)怎么从来都没有出现这样的问题呢?

其实,很多IDE对Tab键做了各种各样的优化,其中有一条就是,将Tab键展开为为空格,也就是说,当你按下Tab的时候,IDE实际上帮你把一个「9」转换成了四个(或者八个)「32」。但是要注意,不是所有的IDE都帮你做了这样的工作!同理,对于好纯洁好不做作的编辑器Vim来说,肯定也不会帮你做这样的工作了。

既然Tab在不同的环境下展现不一样,而空格却永远都是一样的。对于一些细致排版缩进来说(比如说想把每一行的注释都对齐),用空格也更加精确。这样看起来,确实是用空格来写代码要好于用Tab呢。

可是每次缩进都要按好多下空格好烦!难道要抛弃用Vim转投各种IDE吗?

其实,只要掌握好正确的姿势,在使用前配置好.vimrc,就可以玩转Tab啦。

下面结合具体属性来讲解。

set shiftwidth=4 "这个量是每行的缩进深度,一般设置成和tabstop一样的宽度"
set tabstop=4 "设置Tab显示的宽度,Python建议设置成4"

"刚才说过Tab和空格是不同的,虽然你可以在自己的代码中全部使用Tab"
"但是如果你将你的代码分享给使用空格的朋友,就会带来很多麻烦"
"那么设置下面这行就可以将Tab自动展开成为空格"
set expandtab
"如果只想在Python文件中将Tab展开成空格,就改换成下面这句"
autocmd FileType python set expandtab

"上面的一些配置已经可以让你避免编译出现错误的问题了"

"不过下面还有一些配置是建议同学们根据需要加上的"
set smartindent "智能缩进"
set cindent "C语言风格缩进"
set autoindent "自动缩进"


推荐阅读更多精彩内容