Python 中 "空行" 的缩进问题

56 投票
11 回答
14837 浏览
提问于 2025-04-15 22:06

哪种方式更好("."表示空格)?

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在这两种情况下都能正常理解代码,那其实这并不重要,强行去规定哪种写法更好反而会花费很多精力,但收获不大。如果你非常坚持其中一种写法,可以考虑自动把一种转换成另一种。不过,手动去修正所有这样的代码行会是个庞大的工程,真的不值得这么做,我觉得。

撰写回答