Оператор GOTO в Python

Оператор GOTO не ругал только ленивый. Тем не менее, это инструмент, и польза или вред от него определяется только тем, как его используют.

Эта маленькая библиотека позволяет использовать оператор GOTO в коде на Python:

from goto import with_goto

@with_goto
def range(start, stop):
    i = start
    result = []

    label .begin
    if i == stop:
        goto .end

    result.append(i)
    i += 1
    goto .begin

    label .end
    return result

Декоратор with_goto заменяет байт-код для доступа к атрибутам у объектов label и goto на безусловный переход (JUMP_ABSOLUTE). Без него такой код вызвал бы исключение NameError, поскольку переменные begin и end не инициализированны.

Идея добавить GOTO в Python не нова. В 2004 году в качестве первоапрельской шутки была написана другая библиотека. Она работает через функцию trace и требует гораздо бóльших накладных расходов.