我知道我应该将Python代码保留为79列,但是如何缩进行的延续?

时间:2010-08-11 14:32:50

标签: python conventions code-formatting

我知道行宽的标准Python约定是79个字符。我知道可以通过多种方式继续行,例如自动字符串连接,括号和反斜杠。似乎没有明确定义的是如何应该格式化溢出文本。我是否一直将它推回到第1组?到原始线开始的col?到括号的开头(如果适用)?例如,假设我有这样的事情:


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

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

现在假设如上所示的第一行是> 79个字符。在这种情况下应该怎么看?

注意:我知道很多人不同意79个字符的约定。虽然我尊重问题的每一方都有很多利弊,但这次辩论与我的问题无关。我问如何遵守惯例,而不是我是否应该遵守,所以请不要在回复中支持放弃它的好处。谢谢。 =)

7 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:5)

http://www.python.org/dev/peps/pep-0008/Maximum Line Length

  

将所有行限制为最多79行   字符。

     

周围仍有很多设备   限制为80个字符   线;另外,将窗口限制为80   人物可以拥有   几个窗口并排。该   默认包装在这些设备上   破坏了视觉结构   代码,使其更难   了解。因此,请限制   所有行最多为79   字符。用于流动长块   文本(docstrings或comments),   将长度限制为72个字符   推荐。

     

长包裹的首选方式   线是通过使用Pythons暗示线   在括号内继续,   括号和大括号。如有必要,   你可以添加一对   围绕表达的括号,但是   有时使用反斜杠看起来   更好。确保缩进   适当地继续排队。该   打破一个首选的地方   二元运算符是   运营商之后,而不是之前。一些例子:

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)

答案 2 :(得分:3)

即使超越了Python,我也会一直为我的C代码执行此操作,因此我可以(正如PEP所说)在监视器上并排打开2-3个文件并查看它们。

反斜杠运算符\在Python和C中用作行继续运算符,但我更喜欢尝试使用括号()或大括号{}(或括号{}对行进行分组{1}}对于Python列表),无论什么是最方便的。如果我决定在一个持续时间很长的区块中添加另一条线,我不想担心任何愚蠢的“陷阱”:错过[]或更糟糕的是,在{{1}之后有一些错误的空间使连续失效。

对于长条件,我喜欢双缩进,因此更明显的是该代码不是新块的一部分。

\

答案 3 :(得分:2)

PEP 8中有一个例子:

class Rectangle(Blob):

    def __init__(self, width, height,
        # more code
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

在我看来,这表明你的榜样是正确的。我认为你应该在打开括号({)之后打破示例的第一行,如下所示:

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

如果太长了。我不知道它是否是'pythonic',但应该是熟悉和可读的。

答案 4 :(得分:1)

  

长包裹的首选方式   line是使用Python的暗示   线       在括号,括号和括号内继续。如有必要,   您       可以在表达式周围添加一对额外的括号,但是   有时       使用反斜杠看起来更好。确保缩进续行       适当。打破二进制文件的首选位置   运营商是       运营商之后,而不是之前。

答案 5 :(得分:0)

我很确定之前已经回答了这个问题,但我现在找不到它了。

简短的回答是PEP8没有涵盖如何格式化对象文字,除了冒号之前应该有零空格而后面有一个空格。

我是这样做的:

obj = {
     'foo': 1,
     'bar': 2,
     'bas': 3,
}

答案 6 :(得分:0)

好的伎俩也是这样做的:

my_long_string="""
This are
many lines of text
"""

a = [a in my_long_string.split() if a]

有些人喜欢在打开三重引号后使用\而不过滤空行,但我真的很讨厌那些野兽。

对于您的特定示例,我同意cji。