[python] где мой goto?

yroslavasako

Почему в питоне нет goto? Ведь для скриптовых динамических языков такие прыжки натуральны. А так неудобно выходить из вложенных циклов без него. Питоновцы вон рекомендуют исключения бросать. Но как-то черезжопно даже для питон-стайл

margadon

учись тосковать по ассемблеру

yroslavasako

учись тосковать по ассемблеру
зачем мне ассемблер для goto, когда есть common lisp для этих целей?

yroslavasako

 Наслаждайся
вау, спасибо. Таки бог goto есть! Причём как я понял даже нативно

stm5872449

Ну как нативно, там декоратор, модифицирующий байт-код функции. Такими хаками можно много что сделать, user-defined операторы например, геморно только :)

yroslavasako

модифицирующий байт-код функции.
ну как я понял goto (jump) в байт-коде присутствует нативно. Просто его нельзя напрямую из языка вызывать. А декоратор всего лишь служит толмачом

pilot

Но как-то черезжопно даже для питон-стайл
:confused:

rosali

Не знаю насколько это применимо к питону, но в яве например goto формально тоже нет, но на самом деле есть. goto вниз это break на метку, а goto вверх это continue на метку. Правда метку можно поставить только на скоуп, а break/continue должны находиться внутри того скоупа, на метку которого ссылаются. Так что расположить синтаксически правильно начала и концы скоупов в некоторых случаях та еще задачка, но есть доказательство, что это всегда возможно.

yroslavasako

Не знаю насколько это применимо к питону, но в яве например goto формально тоже нет, но на самом деле есть. goto вниз это break на метку, а goto вверх это continue на метку.
нинасколько не применимо. Это замечательный механизм и полностью отвечает всем моим представлениям о возможных корректных способах использования goto. Только он выглядит ещё сложнее, чем goto, хотя и удобнее. Так вот, гвидо такое же предложение отверг, со словами "это же слишком сложно для питон-стайл, юзайте исключения, вот"

soroka000

Почему в питоне нет goto? Ведь для скриптовых динамических языков такие прыжки натуральны. А так неудобно выходить из вложенных циклов без него. Питоновцы вон рекомендуют исключения бросать. Но как-то черезжопно даже для питон-стайл
Пора наверно завязывать с тяжелыми наркотиками. Питон он вообще не о том.
Последний раз я писал прогу, в которой был goto года полтора назад и это был код на си с низкоуровневыми оптимизациями.
Так для этого кода я написал столько же строк комментария, чтобы себе в будущем объяснить, что за черная магия тут творится.
Зачем это все в питоне? Да, интерпретатор может сходить на любую команду байткода и с текущим окружением ее выполнить, но зачем? Ну приведите мне хоть один пример когда это реально нужно (кроме вырожденных случаев и преждевременной оптимизации)

margadon

ну может ему хочется что-то вроде break(n) для того, чтобы одним махом выйти из n вложенных циклов :)

yroslavasako

ну может ему хочется что-то вроде break(n) для того, чтобы одним махом выйти из n вложенных циклов :)
именно. Простые переборные задачи на 30 строк кода. И отсутствие в питоновском цикле for возможности задать флаг окончания. Приходится этот флаг задавать как переменную и вписывать проверку в каждый родительский цикл с breakом местного значения. Питон для меня основной инструмент командно-строчной автоматизации, используется для всех скриптов, где есть больше одного оператора управления командным потоком, иначе баш

fufa58

Приходится этот флаг задавать как переменную и вписывать проверку в каждый родительский цикл с breakом местного значения.
ну таки эксепшены не проще, да?

Serab

они же ебически медленные, не?

yroslavasako

ну таки эксепшены не проще, да?
не для меня. Код начинает выглядеть ещё более непонятно. Количество вложений (и отступов) увеличивается вдвое. Ну и где-то я слышал, что эксепшны нужны для исключений, а не для правил.
Можно было бы монаду заюзать, но питон не функционален

margadon

http://stackoverflow.com/questions/653509/breaking-out-of-ne... немного рассуждений на тему

kedr1983

Впервые узнал о конструкции for...else! :shocked:

yroslavasako

http://stackoverflow.com/questions/653509/breaking-out-of-ne... немного рассуждений на тему
именно оттуда я и узнал, что break(n) никогда в питоне не будет. что заставило озаботиться вопросом более простого goto. Оказалось, что goto в питоне добывается достаточно просто

istran

они же ебически медленные, не?
Не в Python.
Наверное для тебя станет открытием, как работает обычный for в Python. Вкратце, конструкция:

for i in iterable:
do_something

интерпретируется как:

it = iter(iterable)
while True:
try:
i = it.next
except StopIteration:
break
do_something

Т.е. условием завершения цикла for является выбрасывание исключения типа StopIteration при вызове next у итератора.

stm5872449

Не в Python.
Наверное правильнее будет сказать, что в питоне просто все остальное тоже ебически медленное ;)

apl13

Боже!

Serab

да, стало сюрпризом. Спасибо :grin:

schipuchka1

Наверное для тебя станет открытием, как работает обычный for в Python. Вкратце, конструкция:
это работает и в фейсбуковском питоне?

istran

фейсбуковском питоне
Что это?

schipuchka1

тфу, меня замкнуло. Игнорируйте вопрос плиз
Оставить комментарий
Имя или ник:
Комментарий: