在django-viewflow流程中使用paratheses符号

时间:2018-06-07 09:23:09

标签: django parentheses django-viewflow

我一直在理解django-viewflow流程代码中括号的使用。 例如,在下面的代码中

start = (
    flow.Start(views.StartView)
    .Permission('shipment.can_start_request')
    .Next(this.split_clerk_warehouse)
)

# clerk
split_clerk_warehouse = (
    flow.Split()
    .Next(this.shipment_type)
    .Next(this.package_goods)
)

来自here

好像,包含函数的元组被分配给start和split_clerk_warehouse e.t.c.这是什么意思。从我最好的猜测看,似乎.Next函数接受元组作为输入。

注意我确实理解此处使用的方法链接。我只是无法理解括号的使用。

感谢。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你会想知道外部括号的用途是什么。

让我们先编写(第一个,但适用于第二个)语句,不带外括号:

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

但是在这里我们需要在最后为单个元组写一个逗号,或者用逗号, 分隔的多个元素(空元组除外)。< / p>