代码之家  ›  专栏  ›  技术社区  ›  unlockme

django viewflow中并列符号的使用

  •  1
  • unlockme  · 技术社区  · 7 年前

    我对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 回复  |  直到 7 年前
        1
  •  3
  •   willeM_ Van Onsem    7 年前

    如果我理解正确,你会想知道 外面的 括号。

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

    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
    

    但是在这里,我们需要在一个单元组的末尾写一个逗号,或者用 逗号 , (除了空元组)。

    推荐文章