python运算符何时是行延续?

python运算符何时是行延续?,python,syntax,Python,Syntax,以下内容在语法上无效: if extremely_long_condition_that_takes_up_a_whole_line and another_condition: #do something 以下各项有效: if (extremely_long_condition and another_condition): #do something 为什么这些不同?更一般地说,为什么#2可以,但#1有点危险/模棱两可?我看不出第一条语句是如何表达的,也看不出它是

以下内容在语法上无效:

if extremely_long_condition_that_takes_up_a_whole_line and
  another_condition:
    #do something
以下各项有效:

if (extremely_long_condition and
  another_condition):
    #do something

为什么这些不同?更一般地说,为什么#2可以,但#1有点危险/模棱两可?我看不出第一条语句是如何表达的,也看不出它是如何概括为一条模棱两可的语句的。

括号表示行继续,直到结束为止

:

包装长行的首选方法是使用Python的 括号、括号和大括号内的行继续。长队 可以通过在中包装表达式在多行上断开 圆括号。这些应该优先使用,而不是使用反斜杠 用于行继续

或者,在以下章节中进行更正式的讨论:

两条或多条物理线可以使用 反斜杠字符(\)

括号、方括号或大括号中的表达式可以是 在不使用反斜杠的情况下拆分多个物理行


所有括号都内置行连续体。我不太清楚
的具体情况,但不鼓励行连续(
\
-style)的原因是尾部的空格会使命令无效,并且很难看到它们。但是,parens中的尾随空格永远不会打断它。

如果没有大括号,在一元运算符存在的情况下,它肯定是不明确的

以这一行为例:

a = 3 + 4
+1
这里有一个简单的加法,后跟一元正运算符

您可能会争辩说,带有尾随运算符的行并不含糊不清(目前我想不出一个反例),因此我将回到python zen中的“特殊情况不足以打破规则”部分


另请注意,现在的方式是,您可以在不使用运算符的情况下跨多行连接字符串:


另一个有效的、丢失的括号(不推荐):

发件人:

包装长行的首选方法是在括号、方括号和大括号内使用Python的隐含行继续。通过将表达式括在括号中,可以在多行上打断长行应该优先使用这些字符,而不是使用反斜杠作为行的延续。确保适当缩进延续的行


我建议您阅读。

当然,您可以使用函数使其更易于理解

而不是:

if (extremely_long_condition_that_takes_up_a_whole_line and
  another_condition):
    #do something
你可以做:

def cond():
    extremely_long_condition_that_takes_up_a_whole_line

def another_condition():
     # whatever

if cond() and another_condition():
     #do something 
或者,如果您有一系列条件:

if all(conditions(x) for x in seq):
     #do something
Python的设计旨在鼓励将长行和块分解为更小、更可读的位。你遇到了那种鼓励

我试着把行数控制在70个字符以内


对我来说,最困难的是限制嵌套理解的长度。我对这些进行了分解,这样分解实际上有助于可读性。

虽然这是正确的,并且准确地描述了python的行为,但我认为OP已经知道了这一点。OP很好奇为什么你需要大括号来避免歧义。@mgilson这是真的,我似乎没有仔细阅读这个问题。幸运的是,你的答案是+1,这正是OP想要的。虽然我没有仔细阅读标题——也许OP没有像我想的那样理解它,因为这正确地解决了标题中的问题+是的,你的例子显然模棱两可。我的问题是针对拖尾运算符的,我也想不出任何反例。我想我只是觉得有点奇怪。例如,在C或Java中,语句结束时是完全显式的,用运算符结束语句并不少见。对于这一点,我还发现python的缩进非常恼人,我认为这只不过是语言设计中的一个缺陷,我无法编写多行匿名函数。但无论如何。。。这就是世界。@aestrivex越位规则和换行符作为语句结尾对于语言设计者(和许多用户!)来说是不可协商的。但打破界限也很重要,所以问题是如何允许它。事实证明,没有一个健全的(阅读:易于实现和理解)方案能够保留上述要求,并始终允许连续行而无需明确请求(括号或“换行前”)。查看JavaScript的分号插入或Scala,了解“猜测”语句的结尾是如何出错的。
def cond():
    extremely_long_condition_that_takes_up_a_whole_line

def another_condition():
     # whatever

if cond() and another_condition():
     #do something 
if all(conditions(x) for x in seq):
     #do something