Использование символов паратезов в потоке django-viewflow - PullRequest
0 голосов
/ 07 июня 2018

Я затруднялся понять, как использовать круглые скобки в коде потока 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)
)

из здесь

Кажется, что кортеж, содержащий функции, назначен для запуска и для split_clerk_warehouse и т. Д. Что это значит,Насколько я понимаю, кажется, что .Next функции принимают кортеж в качестве входных данных.

ПРИМЕЧАНИЕ Я понимаю метод цепочки, используемый здесь.Я просто в недоумении, чтобы понять использование скобок.

Спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

Если я правильно понимаю, вы задаетесь вопросом, как используются внешние скобки.

Давайте сначала напишем (первое, но применимо ко второму) утверждение без внешних скобок:

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

Это в точности эквивалентно коду в вашем образце.Но вы, вероятно, согласны с тем, что это нечитабельно .Это требует от пользователя прокрутки кода, и, кроме того, это длинная цепочка символов без какой-либо структуры.Программисту будет трудно понять это, особенно если - позже - мы также будем использовать скобки внутри параметров вызовов.

Так что, возможно, имеет смысл написать это следующим образом:

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

Но это не сработает: Python - это язык, который использует интервалы как способ добавления семантики в код.В результате он сломается: Python попытается проанализировать отдельные ссылки как отдельные операторы.Но что тогда делать с хвостовой точкой?В результате синтаксический анализатор выдаст ошибку.

Теперь в Python есть несколько способов написать операторы в режиме многострочный .Например, с обратной косой чертой:

start = flow.Start(views.StartView). <b>\</b>
             Permission('shipment.can_start_request'). <b>\</b>
             Next(this.split_clerk_warehouse)

с обратной косой чертой мы указываем, что следующая строка действительно принадлежит текущей, и, таким образом, она анализируется, как будто мы записали все это в одну строку.

Недостаток в том, что мы легко можем забыть обратную косую черту здесь, и это снова допустит ошибку синтаксического анализатора.Более того, для этого требуется линейная работа : для каждой строки мы должны добавить один элемент.

Но языки программирования на самом деле обычно имеют функцию, которую программисты постоянно используют для группировки (под) выражений вместе: скобки.Мы используем его для предоставления приоритета (например, 3 * (2 + 5)), но мы можем использовать его для простой группировки одного выражения по нескольким строкам, например:

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

Все, что находится в скобках, принадлежитто же выражение, поэтому Python будет игнорировать новые строки.

Обратите внимание, что литералы кортежа также используют скобки.Например:

()              # empty tuple
(1, )           # singleton tuple (one element)
(1, 'a', 2, 5)  # 4-tuple

Но здесь нам нужно написать запятую в конце для одноэлементного кортежа или нескольких элементов, разделенных запятыми , (за исключением пустого кортежа).

...