在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语句的原因,会有不均匀的缩进。

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

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

在编译时连接string文字,就像在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) 

注意圆括号是如何用来使我们不要在纯string之间添加加号,并将结果分散在多行而不需要明确的行连续“\”(丑陋和混乱)。 其优点与下面介绍的相同,区别在于您可以在任何地方进行操作。 与以前的替代方法相比,在检查代码时,视觉效果更好,因为它清楚地概括了msg的开始和结束(与msg +=每行对比一次,这需要一个额外的思考步骤来推断这些行添加到相同的string- 如果你打字错了,在一个随机的行上忘了+ )?

关于这种方法,很多时候我们必须在迭代体内使用迭代和检查来构build一个string,所以在函数调用中添加它的片段(如后面所示)不是一个选项。

紧密的select是:

 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(本身“推”你到右边,这个缩进的消耗是由构成该消息的其余行inheritance的,因为根据PEP 8,它们必须alignment上面print有开头的圆括号,所以如果你的信息已经很长了,这样就不得不分散在更多的行上。

对比:

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

与此(这里build议):

 raise TypeError( 'aaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaa') 

线传播减less。 当然,这最后一种方法不适用于print ,因为这是一个短暂的电话。 但它确实适用于例外。

你可以有一个变化是:

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

注意如何在纯string之间不需要加号。 此外,缩进引导读者的眼睛,没有stream浪的括号挂在左下方。 replace是非常可读的。 特别是,这种方法使得编写代码或math公式成为一项非常令人愉快的任务。

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

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

你只需要把括号中的string括起来。

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

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

我可能会将long语句拆分为多个较短的语句,以便将程序逻辑从长string的定义中分离出来:

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

如果string只是太长而且你select一个简短的variables名,那么你甚至可以避免必须拆分string:

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

如果是长string(例如对于SQL查询),请使用三重码

 ''' hello this is me ''' 

我很惊讶没有人提到上面的隐式风格。 我的首选是使用parens来包装string,而直观地排列string。 就我个人而言,我认为这看起来更清洁,更紧凑,比在标签新行开始string的开始。

请注意,这些parens不是方法调用的一部分 – 它们只是隐式的string连接 。

Python 2:

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

Python 3(与打印function的parens):

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

就我个人而言,我认为分开拼接长string文字和打印它是最清洁的:

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