我写了一些 Python,其中一些行的长度超过 80 个字符,这是我需要保持的阈值。如何调整我的代码以减少行长?
4 回答
我当前的编辑器 (Kate) 已配置为在行长达到或超过 80 个字符时在单词边界上引入换行符。这立即表明我已经越界了。此外,还有一条红线标记了 80 个字符的位置,提前警告我该行何时会溢出。这些让我可以规划适合多条物理线路的逻辑线路。
至于如何真正适合它们,有几种机制。您可以用 \ 结束该行,但这很容易出错。
# works
print 4 + \
2
# doesn't work
print 4 + \
2
区别?区别是不可见的——在第二种情况下,反斜杠后有一个空格字符。哎呀!
应该怎么做?好吧,用括号括起来。
print (4 +
2)
不需要\。这实际上是普遍适用的,你永远不需要 \ 。即使是属性访问边界!
print (foo
.bar())
对于字符串,您可以显式添加它们,也可以使用 C 样式连接隐式添加它们。
# all of these do exactly the same thing
print ("123"
"456")
print ("123" +
"456")
print "123456"
最后,任何形式的括号 (()、[].{}) 中的任何内容,而不仅仅是特别是括号,都可以在任何地方放置换行符。因此,例如,您可以在多行上使用列表文字,只要元素用逗号分隔即可。
所有这些以及更多内容都可以在Python的官方文档中找到。另外,快速说明一下,PEP-8指定 79 个字符作为限制,而不是 80 个——如果你有 80 个字符,那么你已经超过了它。
如果超过 80 个字符的代码是函数调用(或定义),请断开参数行。Python 会识别括号,并将其视为一行。
function(arg, arg, arg, arg,
arg, arg, arg...)
如果超过 80 个字符的代码是一行无法自然破解的代码,则可以使用反斜杠\
“转义”换行符。
some.weird.namespace.thing.that.is.long = ','.join(strings) + \
'another string'
您也可以使用括号来发挥自己的优势。
some.weird.namespace.thing.that.is.long = (','.join(strings) +
'another string')
所有类型的集合括号 {} (dict/set)、[] (list)、() (tuples) 都可以毫无问题地跨越几行。这允许更好的格式。
mydict = {
'key': 'value',
'yes': 'no'
}
我会在前面的答案中添加两点:
字符串可以自动拼接,非常方便:
this_is_a_long_string = ("lkjlkj lkj lkj mlkj mlkj mlkj mlkj mlkj mlkj "
"rest of the string: no string addition is necessary!"
" You can do it many times!")
请注意,这是高效的:这不会导致在代码运行时计算字符串连接:而是直接将其视为单个长字符串文字,因此是高效的。
与德文的回答有关的一点警告:“括号”语法实际上并不“普遍适用”。例如,d[42] = "H22G" 不能写成
(d
[42] = "H2G2")
因为括号只能在“计算”表达式周围使用(这不包括上面的赋值(=))。
另一个示例是以下代码,它会生成语法错误:
with (open("..... very long file name .....")
as input_file):
事实上,括号不能放在语句周围,更一般地说(仅限表达式)。
在这些情况下,可以使用“\”语法,或者更好(因为尽可能避免使用“\”)将代码拆分为多个语句。
使用反斜杠作为最后的手段
因此,如果可以使用括号()
,请避免使用反斜杠。如果你有类似的a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines.across.the.whole.trainyard.and.several.states()
事情:
lines = a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines
lines.across.the.whole.trainyard.and.several.states()
或者,最好重构您的代码。请。