PEP 8是否允许因垂直对齐而使用简单的悬挂缩进?

1 投票
3 回答
2609 浏览
提问于 2025-04-18 01:07

我正在学习Python中的样式规范,阅读PEP 8时遇到了一些困惑。根据PEP 8的规定,如果你使用悬挂缩进(就是第一行不缩进,后面的行缩进),那么你应该增加更多的缩进,以便把函数的参数和函数体区分开来:

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

然后我看到了一段代码,想问问你们,这种情况下条件和其他部分在同一缩进级别上,这样是否有效?这应该算作悬挂缩进吗?还是因为它们是垂直对齐的,所以这样做也可以?

if (value1 == 0 and value2 == 0 and
    value3 == 'valueX' and value4 == 'valueY' or
    value5 > value6):
    raise ValueError("test")

3 个回答

-1

这个 if 的例子是有效的,因为它使用了垂直对齐。你可以查看 PEP8 推荐的缩进规则

它的意思是

当代码行过长需要换行时,换行的部分应该要么在括号、方括号或大括号内垂直对齐,要么使用悬挂缩进。

接下来还给出了一个例子:

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
1

看下面这个关于PEP-8的反例评论:

# Further indentation required as indentation is not distinguishable
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

这直接让我们得出结论,问题在于区分缩进。因此,我想说你的例子需要进一步的缩进。

4

http://pep8online.com/ 这个网站上,你可以检查代码片段是否符合PEP8规范。

如果你把下面的代码粘贴进去:

if (value1 == 0 and value2 == 0 and
    value3 == 'valueX' and value4 == 'valueY' or
    value5 > value6):
    raise ValueError("test")

你会看到它给出了以下提示:

E125 第3行 第5列:续行没有和下一行逻辑上区分开来

如果你把第3行再缩进4个空格,这个错误就会消失。下面的代码是有效的,尽管看起来可能有点奇怪。

if (value1 == 0 and value2 == 0 and
    value3 == 'valueX' and value4 == 'valueY' or
        value5 > value6):
    raise ValueError("test")

不过,像这样写可能更容易阅读,这也是另一种有效的解决方案:

if (value1 == 0 and value2 == 0 and
        value3 == 'valueX' and value4 == 'valueY' or
        value5 > value6):
    raise ValueError("test")

撰写回答