如何让Python代码保持在80个字符以下而不会让它变得丑陋?

Eli*_*Eli 45 python

这是一个在我的所有编程,python和其他方面都不断出现的问题.我真的很想把我的代码保持在80个字符以下,如果可能的话/不是非常难看的话.在像Perl这样的语言中,这并不太难,因为空白并不重要.在Python中,我最终会把头撞到墙上,而不是试图想出一种分裂我的长线的"好"方式.所以,Code大师,你是怎么做到的?您可以告诉我的任何一般策略?

我正在处理的一个特殊问题是:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj, self.user1, self.user2)
Run Code Online (Sandbox Code Playgroud)

当我自然而然地尝试用Python来解决这个问题时,对我来说唯一可行的方法似乎是:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj,
                                                          self.user1
                                                          self.user2)
Run Code Online (Sandbox Code Playgroud)

我想,它看起来并不那么糟糕,但它占用了三行,这完全没必要.必须有更好的方法,不是吗?

注意:我知道有些人不喜欢80个字符,并创建了自己的限制.我理解这背后的动机并尊重它,但80个字符是我的首选限制.请不要占用空间试图说服我去120或其他一些这里.

dav*_*idg 33

你的代码风格似乎坚持如果你在括号内打破一行,下面的行需要与它对齐:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(some_obj,
                                                          self.user1
                                                          self.user2)
Run Code Online (Sandbox Code Playgroud)

如果您愿意放弃此要求,可以按如下方式格式化代码,其中连续行具有固定的双缩进:

self.SomeLongLongName = SomeLongLongName.SomeLongLongName(
        some_obj, self.user1, self.user2)
Run Code Online (Sandbox Code Playgroud)

这样可以避免在页面右侧边缘编写代码,并且一旦习惯就可以读取.它还有一个好处,如果您修改"SomeLongLongName"的名称,您不必重新缩进所有以下行.更长的例子如下:

if SomeLongLongName.SomeLongLongName(
        some_obj, self.user1, self.user2):
    foo()
else:     
    bar()
Run Code Online (Sandbox Code Playgroud)

连续行的双缩进允许您在视觉上将它们与缩进的行分开,因为它们位于块ifelse块中.

正如其他人所指出的那样,使用短名称也有帮助,但这并不总是可行的(例如使用外部API时).

  • 当你有一个连续的行(因为括号仍然打开,或者前一行上有反斜杠字符等),python将忽略它上的缩进.这意味着您可以随意缩进连续的行. (3认同)
  • 是.我在所有语言中都这样做:C,Python,等等. (2认同)

Joh*_*web 20

包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续.通过将表达式包装在括号中,可以在多行中分割长行.这些应该优先使用反斜杠来继续行.确保适当缩进续行.打破二元运算符的首选位置是运算符之后,而不是它之前.

PEP 8 Python代码样式指南(按照示例链接).

  • PEP8本身有一个很好的例子,说明为什么这么短的列宽如此破碎.它的"矩形"类是不可读的,以至于是一种自我模仿,这使人们真正认真对待它令人困惑.不要写那样的代码. (11认同)
  • 没有风格指南是"明确的"; 它们是指南,而不是规则手册,并且只有在与强烈的常识混合时才能有用.我认为,在继续包装线路时,这就像80x25终端仍然是典型的开发环境一样缺乏. (7认同)
  • 同意:`Rectangle`类是一个可怕的例子,但它突出了*如何*打破线条.但是,PEP8是Python代码的权威样式指南.如果你要编写Python代码,你应该坚持下去.[就像你要编写Perl代码一样,你应该避免使用有意义的变量名;-)] (6认同)

Mic*_*ent 15

self.SomeLongLongName = SomeLongLongName.\
    SomeLongLongName(some_obj, self.user1, self.user2)
Run Code Online (Sandbox Code Playgroud)

'\' 是你的朋友.当然,您已经知道可以用逗号分隔参数列表中的行,而不使用'\'.另外,如果你有长串:

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?"
Run Code Online (Sandbox Code Playgroud)

变为:

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?"
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Python将组合相邻的字符串文字,忽略相邻文字字符串之间的空格.

  • 括号可用于字符串:`("abc"\n"def")` (5认同)
  • 当你说Python连接相邻的字符串文字时,我不相信你,所以我去测试它.它确实做到了!Python是否实际上将多个连续的字符串文字视为单个字符串以用于语法目的? (3认同)

Der*_*itz 5

有些人引用Rectangle类作为一个糟糕的例子.pep8中的这个例子不是唯一的方法.

原版的:

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)
Run Code Online (Sandbox Code Playgroud)

这就是写它的方式.

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):
            msg = "I don't think so -- values are %s, %s" % (width, height)     
            raise ValueError(msg)
        Blob.__init__(self, width, height, color, emphasis, highlight)
Run Code Online (Sandbox Code Playgroud)

原因是:

  • 如果你的编辑没有为你做这个并且更难阅读,那么额外缩进以排列'('是浪费时间,因为有很多领先的空白IMO.
  • 除非在代码逻辑中有令人信服的理由,否则我会尽可能晚地破解.
  • 排除'('在这种情况下创建与下一行完全相同的缩进级别...... 非常糟糕的巧合!双缩进延续线解决了这个问题.
  • 如果必须使用续行的原因是试图在一行上做太多,我更喜欢避免.这里的示例是ValueError,它们使用字符串格式运算符进行格式化.我改为设置了msg.(注意:首选使用格式方法的格式字符串,%自3.1以来不推荐使用).