用Python包裹长行

时间:2010-07-27 17:30:42

标签: python string

如何在不牺牲缩进的情况下在Python中包装长行?

例如:

def fun():
    print '{0} Here is a really long sentence with {1}'.format(3, 5)

假设这超过了79个字符的建议限制。我读它的方式,这里是如何缩进它:

def fun():
    print '{0} Here is a really long \
sentence with {1}'.format(3, 5)

但是,使用这种方法,连续行的缩进与fun()的缩进相匹配。这看起来有点难看。如果有人要查看我的代码,由于这个print语句会导致缩进不均匀。

如何在不牺牲代码可读性的情况下有效缩进这样的行?

7 个答案:

答案 0 :(得分:245)

def fun():
    print(('{0} Here is a really long '
           'sentence with {1}').format(3, 5))

Adjecent字符串文字在编译时连接,就像在C中一样。http://docs.python.org/reference/lexical_analysis.html#string-literal-concatenation是一个开始获取更多信息的好地方。

答案 1 :(得分:68)

上面没有提到两种方法,但这两种方法都以符合PEP 8 的方式解决问题,可以让您更好地利用空间。他们是:

msg = (
    'This message is so long, that it requires '
    'more than {x} lines.{sep}'
    'and you may want to add more.').format(
        x=x, sep=2*'\n')
print(msg)

注意如何使用括号来允许我们不在纯字符串之间添加加号,并将结果分布在多行上而不需要显式行继续'\'(丑陋和杂乱)。 优点与下面描述的相同,不同之处在于你可以在任何地方进行。 与之前的替代方案相比,在检查代码时在视觉上更好,因为它清楚地概述了msg的开始和结束(每行与msg +=进行比较,这需要一个额外的思考步骤来推断那些行添加到相同的字符串 - 如果你输入错误,忘记在一个随机行上+怎么办?)。

关于这种方法,很多时候我们必须使用迭代体内的迭代和检查来构建一个字符串,因此在函数调用中添加它的片段,如下所示,不是一种选择。

一个接近的选择是:

msg = 'This message is so long, that it requires '
msg += 'many lines to write, one reason for that\n'
msg += 'is that it contains numbers, like this '
msg += 'one: ' + str(x) +', which take up more space\n'
msg += 'to insert. Note how newlines are also included '
msg += 'and can be better presented in the code itself.'
print(msg)

虽然第一个更好。

另一种方法与之前的方法类似,但它会在print下方的行上启动消息。 这样做的原因是为了获得左侧的空间,否则print(本身会“推动”你向右移动。这种缩进的消耗是由构成消息的其余行继承的,因为根据PEP 8,它们必须与它们上面的print的左括号对齐。因此,如果你的信息已经很长,那么它就会被迫分散到更多行。

对比:

raise TypeError('aaaaaaaaaaaaaaaa' +
                'aaaaaaaaaaaaaaaa' +
                'aaaaaaaaaaaaaaaa')

有了这个(这里建议):

raise TypeError(
    'aaaaaaaaaaaaaaaaaaaaaaaa' +
    'aaaaaaaaaaaaaaaaaaaaaaaa')

线路传播减少了。当然,最后一种方法对print并不适用,因为它是一个短暂的呼叫。但它确实适用于例外。

您可以拥有的变体是:

raise TypeError((
    'aaaaaaaaaaaaaaaaaaaaaaaa'
    'aaaaaaaaaaaaaaaaaaaaaaaa'
    'aaaaa {x} aaaaa').format(x=x))

注意你不需要在纯字符串之间加号。此外,缩进引导读者的眼睛,没有悬挂在左下方的流浪括号。替换是非常易读的。特别是,这种方法使编写生成代码或数学公式的代码成为一项非常愉快的任务。

答案 2 :(得分:21)

您可以使用以下代码,缩进无关紧要:

>>> def fun():
        return ('{0} Here is a really long'
        ' sentence with {1}').format(3, 5)

您只需要在括号中包含字符串。

答案 3 :(得分:18)

您可以使用Python连接彼此相邻的字符串文字这一事实:

>>> def fun():
...     print '{0} Here is a really long ' \
...           'sentence with {1}'.format(3, 5)

答案 4 :(得分:7)

我可能会将长语句拆分为多个较短的语句,以便程序逻辑与长字符串的定义分开:

>>> def fun():
...     format_string = '{0} Here is a really long ' \
...                     'sentence with {1}'
...     print format_string.format(3, 5)

如果字符串只是太长而你选择了一个简短的变量名,那么你甚至可以避免分割字符串:

>>> def fun():
...     s = '{0} Here is a really long sentence with {1}'
...     print s.format(3, 5)

答案 5 :(得分:3)

我很惊讶没有人提到上面的隐含风格。我的偏好是使用parens包裹字符串,同时在视觉上衬砌字符串。我个人认为这比在标签新行上开始字符串的开头更清晰,更紧凑。

请注意,这些parens不是方法调用的一部分 - 它们只是implicit string literal concatenation

Python 2:

def fun():
    print ('{0} Here is a really '
           'long sentence with {1}').format(3, 5)

Python 3(带有用于打印功能的parens):

def fun():
    print(('{0} Here is a really '
           'long sentence with {1}').format(3, 5))

就我个人而言,我认为将长字符串文字与打印连接分开是最干净的:

def fun():
    s = ('{0} Here is a really '
         'long sentence with {1}').format(3, 5)
    print(s)

答案 6 :(得分:0)

如果是长字符串(例如SQL查询),请使用三重代码

'''
hello this is me 
'''