在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)