我有一长串代码,我希望在多行之间分解 . 我使用什么,语法是什么?
例如,添加一串字符串,
e = 'a' + 'b' + 'c' + 'd'
并将它分成两行:
在行的末尾放置 \ 或将语句括在parens ( .. ) 中 . 来自IBM:
\
( .. )
b = ((i1 < 20) and (i2 < 30) and (i3 < 40))
要么
b = (i1 < 20) and \ (i2 < 30) and \ (i3 < 40)
摘自The Hitchhiker的Python指南(Line Continuation):
当逻辑代码行长于可接受的限制时,您需要将其拆分为多个物理行 . 如果行的最后一个字符是反斜杠,Python解释器将连接连续的行 . 这在某些情况下很有用,但通常应该避免因为它的脆弱性:在反斜杠之后添加到行尾的空格会破坏代码并可能产生意外结果 . 更好的解决方案是在元素周围使用括号 . 在行尾留下一个未闭合的括号,Python解释器将加入下一行,直到括号被关闭 . 对于大括号和方括号,同样的行为也适用 . 但是,通常情况下,必须拆分长逻辑行表示您试图同时执行太多操作,这可能会妨碍可读性 .
话虽如此,这里有一个关于多次导入的例子(当超过line limits, defined on PEP-8时):
from app import ( app, abort, make_response, redirect, render_template, request, session )
可能不是pythonic方式,但我通常使用带有join函数的list来编写像SQL查询这样的长字符串 .
query = " ".join([ 'SELECT * FROM "TableName"', 'WHERE "SomeColumn1"=VALUE', 'ORDER BY "SomeColumn2"', 'LIMIT 5;' ])
使用反斜杠结束一行的危险在于,如果在反斜杠之后添加空格(当然,很难看到),则反斜杠不再按照您的想法进行操作 .
有关更多信息,请参阅Python Idioms和Anti-Idioms(适用于Python 2或Python 3) .
从Style Guide for Python Code:
包装长行的首选方法是在括号,括号和括号内使用Python隐含的行继续 . 通过在括号中包装表达式,可以在多行上分割长行 . 这些应该优先使用反斜杠来继续行 . 反斜杠有时可能仍然合适 . 例如,long,多个with语句不能使用隐式延续,因此可以接受反斜杠:open('/ path / to / some / file / you / want / to / read')as file_1, 打开('/ path / to / some / file / being / written','w')作为file_2:file_2.write(file_1.read())另一个这样的情况是使用断言语句 . 确保适当地缩进续行 . 打破二元运算符的首选位置是运算符之后,而不是它之前 . 一些例子:类Rectangle(Blob):
def __init (自我,宽度,高度,color ='black',emphasis = None,highlight = 0):if(width == 0和height == 0和color =='red'和emphasis =='strong'或突出显示> 100):提出ValueError(“抱歉,你输了”)如果width == 0且height == 0且(color =='red'或重点是无):提出ValueError(“我不这么认为 - 值是%s,%s”%(宽度,高度))Blob . init __(自我,宽度,高度,颜色,重点,突出)
编辑:PEP8现在推荐数学家及其出版商使用的相反惯例(用于打破二进制操作)以提高可读性 .
Donald Knuth打破 before 二元运算符的风格使运算符垂直对齐,从而在确定添加和减去哪些项目时减少了眼睛的工作量 .
从PEP8: Should a line break before or after a binary operator?:
Donald Knuth在他的计算机和排版系列中解释了传统规则:“虽然段落中的公式总是在二元运算和关系之后中断,但显示的公式总是在二元运算之前中断”[3] . 遵循数学传统通常会产生更易读的代码:#Yes:易于将操作符与操作数匹配收入=(gross_wagestaxable_interest(股息 - qualified_dividends)
[3]:Donald Knuth的The TeXBook,第195和196页
从马的口中:显式线连接可以使用反斜杠字符(\)将两条或更多条物理线连接成逻辑线,如下所示:当物理线以不是字符串文字或注释的反斜杠结尾时,它连接以下形成一个逻辑行,删除反斜杠和下面的行尾字符 . 例如:如果1900 <年<2100且1 <=月<= 12和1 <=天<= 31和0 <=小时<24 和0 <=分钟<60和0 <=秒<60:#看起来像一个有效的日期返回1以反斜杠结尾的行不能发表评论 . 反斜杠不会继续评论 . 除了字符串文字之外,反斜杠不会继续使用令牌(即除了字符串文字之外的标记不能使用反斜杠在物理行之间拆分) . 反斜杠在字符串文字之外的其他地方是非法的 .
您可以在括号和大括号之间划分线条 . 此外,您可以将反斜杠字符 \ 附加到一行以显式断开它:
x = (tuples_first_value, second_value) y = 1 + \ 2
什么是线?你可以在下一行有参数而没有任何问题:
a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, blahblah6, blahblah7)
否则你可以这样做:
if a == True and \ b == False
有关更多信息,请查看style guide .
从您的示例行:
a = '1' + '2' + '3' + \ '4' + '5'
要么:
a = ('1' + '2' + '3' + '4' + '5')
请注意,样式指南表示使用括号的隐式延续是首选,但在这种特殊情况下,只是在表达式周围添加括号可能是错误的方法 .
8 回答
在行的末尾放置
\
或将语句括在parens( .. )
中 . 来自IBM:要么
摘自The Hitchhiker的Python指南(Line Continuation):
话虽如此,这里有一个关于多次导入的例子(当超过line limits, defined on PEP-8时):
可能不是pythonic方式,但我通常使用带有join函数的list来编写像SQL查询这样的长字符串 .
使用反斜杠结束一行的危险在于,如果在反斜杠之后添加空格(当然,很难看到),则反斜杠不再按照您的想法进行操作 .
有关更多信息,请参阅Python Idioms和Anti-Idioms(适用于Python 2或Python 3) .
从Style Guide for Python Code:
def __init (自我,宽度,高度,
color ='black',emphasis = None,highlight = 0):
if(width == 0和height == 0和
color =='red'和emphasis =='strong'或
突出显示> 100):
提出ValueError(“抱歉,你输了”)
如果width == 0且height == 0且(color =='red'或
重点是无):
提出ValueError(“我不这么认为 - 值是%s,%s”%
(宽度,高度))
Blob . init __(自我,宽度,高度,
颜色,重点,突出)
编辑:PEP8现在推荐数学家及其出版商使用的相反惯例(用于打破二进制操作)以提高可读性 .
Donald Knuth打破 before 二元运算符的风格使运算符垂直对齐,从而在确定添加和减去哪些项目时减少了眼睛的工作量 .
从PEP8: Should a line break before or after a binary operator?:
在Python代码中,只要约定在本地一致,就允许在二元运算符之前或之后中断 . 对于新代码,建议使用Knuth的样式 .
[3]:Donald Knuth的The TeXBook,第195和196页
您可以在括号和大括号之间划分线条 . 此外,您可以将反斜杠字符
\
附加到一行以显式断开它:什么是线?你可以在下一行有参数而没有任何问题:
否则你可以这样做:
有关更多信息,请查看style guide .
从您的示例行:
要么:
请注意,样式指南表示使用括号的隐式延续是首选,但在这种特殊情况下,只是在表达式周围添加括号可能是错误的方法 .