Python 中 "空行" 的缩进问题
哪种方式更好("."表示空格)?
A)
def foo():
x = 1
y = 2
....
if True:
bar()
B)
def foo():
x = 1
y = 2
if True:
bar()
我觉得应该是B(这也是Vim给我的感觉),但我看到很多人总是用A)。这难道只是因为大多数编辑器都有问题吗?
11 个回答
27
在空行添加合适的缩进(问题中的A样式)可以大大提高代码的可读性,尤其是在显示空白字符的情况下。这样一来,我们就能更容易地判断空行后面的代码是否属于同一个缩进块。
对于像Python这样的语言,它没有结束语句或闭合括号,我很惊讶这没有被纳入PEP(Python增强提案)。在编辑Python代码时,强烈建议开启显示空白字符,这样可以避免尾部空白和混合缩进的问题。
来对比一下下面的两种情况:
A)
def foo():
....x = 1
....y = 2
....
....if True:
........bar()
B)
def foo():
....x = 1
....y = 2
....if True:
........bar()
在A中,最后两行代码明显是属于foo
的。这在更高的缩进层级时更为重要。
55
如果你使用A,你可以把你的代码块直接复制粘贴到Python的命令行里,但如果使用B,就会出现一个意想不到的缩进错误("IndentationError: unexpected indent")。
29
PEP 8是Python的一份风格指南,虽然它在这个问题上没有说得很清楚,但关于“空行”的部分可以理解为支持B的写法。PEP 8的风格检查工具(pep8.py)更倾向于B的写法,并且如果你用A的写法,它会给你警告;不过这两种写法都是合法的。我的看法是,既然Python在这两种情况下都能正常理解代码,那其实这并不重要,强行去规定哪种写法更好反而会花费很多精力,但收获不大。如果你非常坚持其中一种写法,可以考虑自动把一种转换成另一种。不过,手动去修正所有这样的代码行会是个庞大的工程,真的不值得这么做,我觉得。