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