如何在 Python 中执行换行(行继续)(拆分一长行源代码)?
- 2024-11-25 08:49:00
- admin 原创
- 161
问题描述:
鉴于:
e = 'a' + 'b' + 'c' + 'd'
我怎样才能用两行来写上述内容?
e = 'a' + 'b' +
'c' + 'd'
另请参阅:如何将长字符串的定义拆分为多行?如果代码中有一个长字符串文字需要分解才能很好地换行。
解决方案 1:
这行是什么?你可以在下一行输入参数而不会出现任何问题:
a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5,
blahblah6, blahblah7)
否则你可以做这样的事情:
if (a == True and
b == False):
或者使用明确的换行符:
if a == True and \n b == False:
查看样式指南以了解更多信息。
使用括号,您的示例可以写在多行上:
a = ('1' + '2' + '3' +
'4' + '5')
使用显式换行可以获得相同的效果:
a = '1' + '2' + '3' + \n '4' + '5'
请注意,样式指南指出最好使用带括号的隐式延续,但在这种特殊情况下,仅在表达式周围添加括号可能是错误的做法。
解决方案 2:
来自PEP 8——Python 代码样式指南:
换行较长的行的首选方法是使用 Python 的隐式行续行符(在括号、中括号和大括号内)。可以将表达式放在括号内,从而将较长的行拆分为多行。应优先使用这些符号,而不是使用反斜杠进行行续行。
有时反斜杠可能仍然合适。例如,长的多个 with 语句不能使用隐式延续,因此反斜杠是可以接受的:
with open('/path/to/some/file/you/want/to/read') as file_1, \n> open('/path/to/some/file/being/written', 'w') as file_2: file_2.write(file_1.read())
另一个这样的情况是使用断言语句。
确保适当缩进续行。二元运算符周围的首选换行位置是运算符之后,而不是之前。以下是一些示例:
class Rectangle(Blob): def __init__(self, width, height, color='black', emphasis=None, highlight=0): if (width == 0 and height == 0 and color == 'red' and emphasis == 'strong' or highlight > 100): raise ValueError("sorry, you lose") if width == 0 and height == 0 and (color == 'red' or emphasis is None): raise ValueError("I don't think so -- values are %s, %s" % (width, height)) Blob.__init__(self, width, height, color, emphasis, highlight)file_2.write(file_1.read())
PEP8 现在建议采用数学家及其出版商使用的相反的约定(在二元运算中中断),以提高可读性。
唐纳德·克努斯 (Donald Knuth) 在二元运算符前打破的风格将运算符垂直对齐,从而在确定添加和减去哪些项时减少了眼睛的工作量。
来自PEP8:应该在二元运算符之前还是之后换行?:
唐纳德·克努斯 (Donald Knuth) 在他的《计算机和排版》系列中解释了这一传统规则:“尽管段落内的公式总是在二元运算和关系之后中断,但显示的公式总是在二元运算之前中断”[3]。
遵循数学的传统通常会产生更易读的代码:
# Yes: easy to match operators with operands
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
在 Python 代码中,允许在二元运算符之前或之后中断,只要约定在本地保持一致即可。对于新代码,建议采用 Knuth 的风格。
解决方案 3:
使用反斜杠来结束一行的危险在于,如果在反斜杠后添加了空格(当然,这很难看到),反斜杠就不再发挥您想象的作用了。
有关详细信息,请参阅 Python 习语和反习语(适用于Python 2或Python 3)。
解决方案 4:
将 放在`行末或将语句括在括号中
( .. )`。来自IBM:
b = ((i1 < 20) and
(i2 < 30) and
(i3 < 40))
或者
b = (i1 < 20) and \n (i2 < 30) and \n (i3 < 40)
解决方案 5:
您可以在括号和大括号之间换行。此外,您还可以将反斜杠字符附加``到行以明确换行:
x = (tuples_first_value,
second_value)
y = 1 + \n 2
解决方案 6:
来自权威的消息:显式线路连接
可以使用反斜杠字符 ( ) 将两个或多个物理行连接成逻辑行``,如下所示:当物理行以不是字符串文字或注释一部分的反斜杠结尾时,它将与后面的行连接起来形成单个逻辑行,删除反斜杠和后面的行尾字符。例如:
if 1900 < year < 2100 and 1 <= month <= 12 \n> and 1 <= day <= 31 and 0 <= hour < 24 \n> and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date return 1
以反斜杠结尾的行不能带有注释。反斜杠不会延续注释。反斜杠不会延续除字符串文字之外的标记(即,除字符串文字之外的标记不能使用反斜杠跨物理行拆分)。在字符串文字之外的行上,反斜杠是非法的。
解决方案 7:
如果由于字符串过长而想断行,可以将字符串拆分成几部分:
long_string = "a very long string"
print("a very long string")
将被取代
long_string = (
"a "
"very "
"long "
"string"
)
print(
"a "
"very "
"long "
"string"
)
两个打印语句的输出:
a very long string
请注意矫揉造作中的括号。
还要注意,将文字字符串分成几部分允许仅在字符串的部分上使用文字前缀并混合分隔符:
s = (
'''2+2='''
f"{2+2}"
)
解决方案 8:
还可以将方法调用分成obj.method()
多行()。
将命令括在括号“ ()
”中并跨越多行:
> res = (some_object
.apply(args)
.filter()
.values)
例如,我发现它在链式调用 Pandas/Holoviews 对象方法时很有用。
解决方案 9:
这可能不是 Python 的方式,但我通常使用带有连接函数的列表来编写长字符串,就像 SQL 查询一样:
query = " ".join([
'SELECT * FROM "TableName"',
'WHERE "SomeColumn1"=VALUE',
'ORDER BY "SomeColumn2"',
'LIMIT 5;'
])
解决方案 10:
摘自《Python 漫游指南》(行继续):
当逻辑代码行超过可接受的限制时,您需要将其拆分为多个物理行。如果行的最后一个字符是反斜杠,Python 解释器将连接连续的行。这在某些情况下很有用,但通常应避免使用它,因为它很脆弱:在行尾的反斜杠后添加空格会破坏代码并可能导致意外结果。
更好的解决方案是使用括号括住元素。如果行尾的括号未闭合,Python 解释器将连接下一行,直到括号闭合。花括号和方括号的行为相同。
然而,很多时候,必须分割较长的逻辑行表明您试图同时做太多事情,这可能会影响可读性。
话虽如此,这里有一个考虑多个导入的示例(当超过PEP-8 上定义的行限制时),也适用于一般字符串:
from app import (
app, abort, make_response, redirect, render_template, request, session
)