用Python换行

2024-04-16 10:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在不牺牲缩进的情况下用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语句,缩进不均匀看起来很糟糕。

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


Tags: 方法代码formathereisdefwith方式
3条回答

在缩进无关紧要的情况下,可以使用以下代码:

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

你只需要把字符串放在括号里。

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

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

有两种方法没有在上面提到,但是这两种方法都以符合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))

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

相关问题 更多 >