如果我理解正确,您想知道外括号的用途是什么。
让我们首先编写不带外括号的(第一个,但适用于第二个)语句:
start = flow.Start(views.StartView).Permission('shipment.can_start_request').Next(this.split_clerk_warehouse)
这与您的示例中的代码完全相同。但您可能同意这是非常难以理解的。它需要用户滚动代码,而且它是一长串字符,没有任何结构。程序员将很难理解它,尤其是如果 - 稍后 - 我们还将在调用参数中使用括号。
所以也许把它写成这样是有意义的:
start = flow.Start(views.StartView).
Permission('shipment.can_start_request').
Next(this.split_clerk_warehouse)
但这行不通:Python 是一种使用空格作为在代码上附加语义的一种方式的语言。结果它将中断:Python 将尝试将单独的链接解析为单独的语句。但是,如何处理拖尾点呢?结果解析器会出错。
现在 Python 有一些方法可以以多行方式编写语句。例如使用反斜杠:
start = flow.Start(views.StartView). \
Permission('shipment.can_start_request'). \
Next(this.split_clerk_warehouse)
通过反斜杠,我们指定下一行实际上属于当前行,因此它的解析就像我们在一行上写的一样。
缺点是我们很容易忘记这里的反斜杠,这会再次让解析器出错。此外,这需要线性工作:对于每一行,我们必须添加一个元素。
但是编程语言实际上通常具有程序员经常用来将(子)表达式组合在一起的特性:括号。我们使用它来提供优先级(例如3 * (2 + 5)
),但我们也可以使用它来简单地将一个表达式分组到多行,例如:
start = (
flow.Start(views.StartView)
.Permission('shipment.can_start_request')
.Next(this.split_clerk_warehouse)
)
括号内的所有内容都属于同一个表达式,因此 Python 将忽略新行。
请注意,元组文字也使用括号。例如:
() # empty tuple
(1, ) # singleton tuple (one element)
(1, 'a', 2, 5) # 4-tuple
但是这里我们需要在单个元组的末尾写一个逗号,或者用逗号,
分隔的多个元素(空元组除外)。