在Python中,如何在多个缩进的情况下保持每行限制为79个字符?

11

我了解编写优秀的Python代码需要将每行保持在不超过79个字符内。

这通常情况下是可以的,但如果我的代码中有多个嵌套的for循环和if语句,还有它们本身嵌套在一个类中,那么我可能会发现在开始之前有5或6个缩进(即如果我每次缩进4个空格,则为20-24个字符)。然后79个字符的限制就变得非常棘手了。我知道一些技巧,例如在括号中使用隐式连续性并使用括号来连接长字符串,但即使如此,也会变得有些琐碎。

那么,你们这些专家有什么建议呢?

缩进2个空格而不是4个将有所帮助,但这是否被认为是良好的风格呢?我不确定它是否有助于使我的代码更易读,而且我注意到PEP8建议使用4个空格。

如果我发现我有多个级别的缩进,这可能是我正在编写糟糕的代码的表现吗?如果是这样,是否有任何有用的提示或技巧可以避免嵌套过深?

首先,我坚持遵循79个字符的建议是正确的吗?

还是我只能习惯于将许多语句分成多行?

谢谢 Adam


8
一般来说,尽量避免过多缩进。多层嵌套的循环是算法效率低下的一种表现。 - Martijn Pieters
完全同意。你很少会看到代码因为缩进而在79个字符中没有足够的空间。 - Alexander Zhukov
PEP 8还说明了行的安全、可读的缩进。http://www.python.org/dev/peps/pep-0008/#code-lay-out 显示了哪些行可以被分割。例如,如果你有一个需要很多参数的函数,可以用'('开头,在下一行或两行或三行写出函数,然后在随后的一行上关闭它。我编写过大型程序,始终遵循PEP 8,并且不会因此变得笨拙。唯一会变得奇怪的时候是处理长字符串,但如果字符串太长,它们本来就不应该是程序化的。 - Leifingson
79个字符非常有用,因为许多控制台都是80x25(或80x43、80x50);超过79个字符时,在该屏幕上进行编辑时,会出现令人讨厌的代码换行。但是,http://www.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds... 如果您没有此限制,则在项目中保持一致,并使您的生活更轻松... 然后选择有意义的内容。 - Corley Brigman
2
坚持每行79个字符的长度,这意味着当你在 Stack Overflow 上发布代码时,它不会消失在盒子的右侧。 - Gareth Rees
1个回答

9

1. 循环

通常可以使用 itertools.productitertools.combinations 来将嵌套的循环转换为单个循环。

如果循环是独立的,请使用 product。例如,这些嵌套的循环:

for x in range(3):
    for y in range(5):
        for z in range(7):
            print((x, y, z))

成为单一循环:
from itertools import product
for x, y, z in product(range(3), range(5), range(7)):
    print((x, y, z))

当循环索引必须不同的时候,您可以使用combinations。例如,这些嵌套循环:

for start in range(length - 1):
    for end in range(start + 1, length):
        print((start, end))

成为单一循环:
from itertools import combinations
for start, end in combinations(range(length), 2):
    print((start, end))

请参考此处一个使用product的实际示例,以及此处一个使用combinations的示例。

2. 条件语句

当您有很多if语句时,通常可以重新组织代码以节省缩进步骤,并同时使代码更清晰。基本思想是先处理错误,然后处理可以立即返回的情况,这样条件的主体就不需要缩进太远(或者在许多情况下根本不需要缩进)。例如,如果您有像下面这样的代码:

if x >= 0:
    if x == 0:
        return 1
    else:
        # ... main body here ...
        return result
else:
    raise ValueError("Negative values not supported: {!r}".format(x))

然后您可以像这样重新组织代码:

if x < 0:
    raise ValueError("Negative values not supported: {!r}".format(x))
if x == 0:
    return 1
# ... main body here ...
return result

这样做可以为主体部分节省两个缩进级别。


谢谢Gareth,这些确实看起来像是有用的提示和技巧,以确保我没有太多层次的缩进。 - Adam Jacobs
关于嵌套/内部函数,当使用nonlocal在内部/嵌套函数中更新变量时,有什么建议吗? - tommy.carstensen
@tommy.carstensen:这将成为一个很好的适合在Stack Overflow上提问的问题。 - Gareth Rees
在我看来,我发现这两个“修复”方案都不如原始的缩进解决方案易读。如果我必须在这两个方案和违反79字符规则之间做出选择,我会选择后者。 - Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接