наконец, блок execute перед операцией break, continue, return оператора try в python - PullRequest
1 голос
/ 18 марта 2020

Блок finally выполняется перед оператором break или continue или return предложения try в python, тогда почему вывод этого кода отличается

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return "ola"

print(bool_return())

вывод:

foo ola

почему?

Ответы [ 3 ]

1 голос
/ 18 марта 2020

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

Если Python немедленно вернется, это будет конец функции. Считается, что блок finally выполняется независимо от того, что происходит, поэтому он должен запускаться первым, даже если первоначальный возврат теряется.

0 голосов
/ 18 марта 2020

Ваш код

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return print("ola")

print(bool_return())

использует предложение finally. Предложение finally выполняется перед выходом из блока try / except. Это означает, что ваш аргумент может быть передан следующему (псевдокод!):

function bool_return():
    do in case of errors goto Errors:
        var r = print("foo") < this is the statement in the try block
        print("ola") < this is the statement in the finally one
        return r
Errors:
        do nothing < this is the pass instruction.
        var r = print ("ola")
        return r 

print(bool_return())

На мгновение проигнорируйте утверждение return, которое может быть неверным, виновником вашего вопроса является то, как работает интерпретатор операторы:

 return print("foo")

разбиты на две части

var r = print("foo") < this is the statement in the try block
return r

, а затем выполняется содержимое finally до возврата

var r = print("foo") < this is the statement in the try block
print ("ola")
return r

Это происходит потому, что семантика блока try заключается в следующем

  • и запускать все, что включено в блок try. Если он работает без ошибок, сохраните возвращаемое значение, если оно присутствует, затем запустите содержимое блока finally. Если здесь не возникает ошибок и у нас есть возвращаемое значение, просто верните это сохраненное возвращаемое значение
  • , если в блоке try есть ошибка, затем запустите то, что находится в блоке except (если есть). Если ошибок здесь нет, сохраните возвращаемое значение, если оно есть, запустите блок finalize, Если ошибок здесь нет, просто верните сохраненное возвращаемое значение
  • , если блок except как ошибка, выполнение остановлен и блок finally запущен. Затем исключение распространяется на внешний блок.
  • , и теперь все может запутаться, поскольку вы можете (и будете) вкладывать несколько блоков try. Вышеупомянутые шаги повторяются до тех пор, пока не будет обработано исключение или пока не будет достигнут блок интерпретатора try. В последнем случае приложение останавливается, и исключение выводится на консоль с обычным синтаксисом traceback.

Это просто для того, чтобы дать вам представление о том, как оно работает. Некоторые детали могут отсутствовать или могут быть не на 100% правильными. Если вы хотите получить больше информации, вы можете играть с исключениями на W3 C и узнать больше здесь .

0 голосов
/ 18 марта 2020

Блок finally - это нечто, где мы пишем код для закрытия соединений с другими серверами. Если в случае, если мы вернулись из оператора, у нас будут открыты соединения, поэтому он будет выполнен перед выходом из функции. Мы можем проверить, пишем ли мы возврат в последний блок и пытаемся ли блок выполнить, который выполняет

...