Как отделить условную логику прерывания от операторов while для удобства чтения, инкапсуляции и DRYPython

Программы на Python
Ответить
Anonymous
 Как отделить условную логику прерывания от операторов while для удобства чтения, инкапсуляции и DRY

Сообщение Anonymous »

Общий вопрос
Интересно, как выразить любой код формы

Код: Выделить всё

    while True:
state_before = some_function(my_object)

# algorithmic code goes here

state_after = some_function(my_object)
if some_condition(state_before, state_after, my_object):
break
(т. е. то, что поддерживаются некоторыми языками до тех пор, пока) через шаблон

Код: Выделить всё

    while iteration_operates_in_some_way(my_object):
# algorithmic code goes here
Обратите внимание, что это должно поддерживать вложение, включая вложение для того же объекта, например

Код: Выделить всё

    while iteration_operates_in_some_way(my_object):
# algorithmic code goes here
while iteration_operates_in_some_way(my_object):
# more algorithmic code
# even more algorithmic code

Иллюстративный пример
Скажем, вы хотите написать этот фрагмент

Код: Выделить всё

prev_length = -1
while len(my_list) != prev_length:
prev_length = len(my_list)
# algorithmic code goes here
простым английским языком, как

Код: Выделить всё

while length_changed(my_list):
# algorithmic code goes here
Я смог зайти только так далеко:

Код: Выделить всё

tracker = LengthTracker(my_list)
while tracker.changed():
# algorithmic code goes here
Чтобы сосредоточиться на самом вопросе, я избавлю вас от чтения реализации класса LongTracker, потому что этот код на стороне клиента уже показывает, почему мне не нравится этот подход: существует дополнительная инициализация объекта трекера, плюс она загрязняет мой код, поскольку объект без необходимости продолжает существовать после завершения цикла.
Думаю, поскольку мне нужна автоматическая инициализация, я мог бы искать концепцию, которая структурно связана с ключевым словом while точно так же, как концепция итератор связана с ключевым словом for. Например, когда вы делаете for x в range(10), тогда range обрабатывает как инициализацию перед циклом, так и шаг итерации, поэтому вы можете создать его на лету внутри оператора for.
Но предыдущий абзац является всего лишь умозрительным, подход с объектом трекера - это всего лишь пример неудачной попытки, а проблема с длиной - просто для иллюстрации.
Моя цель – найти решение общей проблемы с шаблонами, приведенной в начале сообщения.

Подробнее здесь: https://stackoverflow.com/questions/798 ... eadability
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»