如何在不让Python代码变丑的情况下保持在80字符以内?

53 投票
7 回答
35241 浏览
提问于 2025-04-16 10:52

这个问题在我所有的编程中经常出现,不论是用Python还是其他语言。我真的很想把我的代码控制在80个字符以内,如果可能的话,尽量不让它看起来太丑。在像Perl这样的语言中,这并不难,因为空格不重要。但在Python中,空格是有讲究的,所以我经常为如何“优雅”地拆分长行而感到头疼。那么,各位编程高手,你们是怎么做到的?有没有什么通用的策略可以分享给我?

我现在遇到的一个具体问题是:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj, self.user1, self.user2)

当我试图在Python中自然地切断这段代码时,似乎只有一种还算不错的方法:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj,
                                                          self.user1
                                                          self.user2)

我想这看起来还不错,但它占用了三行,这实在是没必要。难道没有更好的方法吗?

注意:我知道有些人不喜欢每行80个字符,并且设定了自己的限制。我理解你们的动机并且尊重这一点,但80个字符是我偏好的限制。请不要在这里浪费空间试图说服我改成120或者其他的限制。

7 个回答

22
self.SomeLongLongName = SomeLongLongName.\
    SomeLongLongName(some_obj, self.user1, self.user2)

'\' 是你的好朋友。当然,你已经知道在参数列表中可以通过逗号来换行,而不需要使用 '\'。另外,如果你有很长的字符串:

myLongString = "This is a really long string that is going to be longer than 80 characters so oh my what do I do to make this work out?"

就会变成:

myLongString = "This is a really long string that is going to be longer than"\
    " 80 characters so oh my what do I do to make this work out?"

之所以这样有效,是因为 Python 会把相邻的字符串合并在一起,忽略它们之间的空白部分。

36

你的代码风格似乎要求如果在括号内换行,下面的行也要对齐:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj,
                                                          self.user1
                                                          self.user2)

如果你愿意放弃这个要求,可以按照下面的方式格式化代码,这样继续的行就有一个固定的双重缩进:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(
        some_obj, self.user1, self.user2)

这样可以避免代码写到页面的右边缘,而且一旦习惯了,这种格式非常易读。还有一个好处是,如果你修改了“SomeLongLongName”的名字,就不需要重新缩进后面的所有行了。一个更长的例子如下:

if SomeLongLongName.SomeLongLongName(
        some_obj, self.user1, self.user2):
    foo()
else:     
    bar()

继续的行使用双重缩进,可以让你在视觉上将它们与因为在ifelse块中而缩进的行区分开来。

正如其他人提到的,使用短一些的名字也有帮助,但这并不总是可行(比如使用外部API时)。

22

在Python中,处理长行代码的推荐方法是使用括号、方括号和大括号来隐式地继续行。也就是说,当一行代码太长时,可以通过把表达式放在括号里来换行。这样做比用反斜杠来换行要好。记得要适当地缩进继续的那一行。通常来说,最好在二元运算符(比如加号、减号等)后面换行,而不是在前面。

PEP 8 Python代码风格指南(点击链接查看示例)。

撰写回答