Если я правильно понимаю, вам интересно, для чего нужны внешние скобки.
Сначала напишем (первое, но применимое ко второму) утверждение без внешних скобок:
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
Но здесь нам нужно написать запятую в конце для одноэлементного кортежа или нескольких элементов, разделенных запятой ,
(кроме пустого кортежа).
person
Willem Van Onsem
schedule
07.06.2018