我知道Python代码应该限制在79列,但如何缩进行续呢?

4 投票
7 回答
1061 浏览
提问于 2025-04-16 02:38

我知道在Python中,标准的行宽限制是79个字符。我也知道可以通过几种方式来换行,比如自动连接字符串、使用括号和反斜杠。不过,关于溢出文本应该怎么格式化,这一点似乎没有明确的规定。我应该把它缩进到第一列吗?还是缩进到原始行的起始位置?或者是括号的起始位置(如果有的话)?举个例子,如果我有这样的代码:


        self.someLongAttributeName = {'someLongKeyName':'someLongValueName',
                                      'anotherLongKeyName':'anotherLongValueName'}

假设我上面用的格式符合79个字符的限制,那么第二行的缩进是正确的吗?

现在假设上面显示的第一行超过了79个字符,那这种情况下应该怎么处理呢?

注意:我知道很多人对79个字符的限制有不同的看法。虽然我尊重每种观点都有其优缺点,但这个争论和我的问题无关。我想知道的是如何遵循这个规范,而不是我是否应该遵循,所以请不要在回复中讨论放弃这个规范的好处。谢谢。=)

7 个回答

3

不仅仅是在Python中,我在写C代码的时候也经常这样做,这样我就可以像PEP所说的那样,在一个显示器上并排打开2到3个文件,方便查看。

在Python和C中,反斜杠符号\可以用来表示代码行的延续,但我更喜欢用括号()、大括号{}(或者在Python列表中用方括号[])来把代码行分组,这样更方便。如果我决定在一个长的代码块中间添加另一行,我就不想担心一些小问题,比如漏掉了一个\,或者更糟糕的是,在\后面多了一个空格,这样就会导致延续失效。

对于长的条件语句,我喜欢使用双缩进,这样可以更明显地看出这段代码不是新代码块的一部分。

if (somethingLong == x or
        somethingElse == y or
        somethingOld == z or
        x < y < z or
        doIt.now()):
    pass
5

http://www.python.org/dev/peps/pep-0008/ 查看 最大行长度

所有行的长度都要限制在最多79个字符。

现在还有很多设备只能显示80个字符的行;而且,把窗口限制在80个字符内,可以让多个窗口并排显示。这样做可以避免代码的视觉结构被打乱,让理解代码变得更容易。因此,请将所有行的长度限制在最多79个字符。对于长文本块(比如文档字符串或注释),建议将长度限制在72个字符。

处理长行的推荐方式是使用Python的隐式行继续,通常是在括号、方括号和大括号内。如果需要,你可以在表达式周围加一对额外的括号,但有时候使用反斜杠会看起来更好。确保继续的行缩进得当。对于二元运算符,最好在运算符之后断行,而不是之前。以下是一些示例:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if width == 0 and height == 0 and \
           color == 'red' and emphasis == 'strong' or \
           highlight > 100:
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)
11

假设我上面使用的格式符合79个字符的限制,那么第二行的缩进是正确的吗?

是的,这就是PEP 8在示例中展示的方式:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if width == 0 and height == 0 and \
           color == 'red' and emphasis == 'strong' or \
           highlight > 100:
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

但是当开括号或大括号已经接近第79列时,我通常会这样处理:

Two good reasons to break a particular rule:

(1) When applying the rule would make the code less readable, even for
    someone who is used to reading code that follows the rules.
[...]

然后做类似这样的事情

self.some_long_attribute_name = {
    'someLongKeyName': 'someLongValueName',
    'anotherLongKeyName': 'anotherLongValueName'
}

或者

long_object_name.do_something_with_long_name(
    long_expression_returning_is_first_arg,
    long_expression_returning_is_second_arg
)

撰写回答