Использование символов paratheses в потоке 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)
)

из здесь

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

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

Спасибо.


person unlockme    schedule 07.06.2018    source источник
comment
Нет, внешние скобки предназначены только для обеспечения правильного отступа.   -  person Willem Van Onsem    schedule 07.06.2018
comment
@Willem Van Onsem, как это позволяет Python. Я думал, что python имеет отступ пробела. Могу ли я также использовать его в другом месте в моем коде.   -  person unlockme    schedule 07.06.2018
comment
именно поэтому: потому что Python предназначен для пространства.   -  person Willem Van Onsem    schedule 07.06.2018
comment
Это снесло мне голову. Итак, вы говорите, что внешние скобки не создают экземпляр функции внутри кортежа? @WillemVanOnsem   -  person unlockme    schedule 07.06.2018
comment
нет, для одноэлементного кортежа требуется запятая в конце, а для 2-кортежей или более-кортежей должны быть запятые, но здесь не запятые, а точки, используемые для доступа к атрибуту.   -  person Willem Van Onsem    schedule 07.06.2018
comment
Это означает, что я мог бы также написать эту функцию как `split_clerk_warehouse = flow.Split().Next(this.shipment_type).Next(this.package_goods)'   -  person unlockme    schedule 07.06.2018
comment
В яблочко. Например, вы можете отредактировать файл и протестировать его.   -  person Willem Van Onsem    schedule 07.06.2018
comment
Хорошо, спасибо, @WillemVanOnsem. может быть, вы могли бы добавить ответ, и я принимаю его на ваш счет   -  person unlockme    schedule 07.06.2018
comment
кстати, есть еще один возможный стиль для форматирования кода потока — использовать разрывы строк внутри скобок вызова метода github.com/viewflow/cookbook/blob/master/custom_ui/demo/parcel/   -  person kmmbvnr    schedule 07.06.2018


Ответы (1)


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

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

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