Насколько дорого стоит повышение в Питоне?
В процессе разработки с использованием drf потребовался эффективный метод обработки ошибок.
Я нашел два метода, один использует ErrorResponse, созданный путем наследования Response, и один использует APIException, предоставленный drf.
Первый метод выполняется через return, а второй использует команду raise.
Интересно, какой из них эффективнее и почему!
Заранее прошу прощения за то, что вопрос может быть слишком расплывчатым.
raise
приводит к ошибке на текущем уровне стека вызовов. Вы можете перехватить поднятую ошибку, покрыв область, где ошибка может быть поднята в try, и обработав эту ошибку в except.
return
с другой стороны, возвращает значение в то место, откуда была вызвана функция, поэтому возврат исключения обычно не является функциональностью, которую вы ищете в подобной ситуации, поскольку само исключение не является тем, что вызывает исключение.
https://docs.python.org/3/reference/simple_stmts.html#raise
https://docs.python.org/3/reference/simple_stmts.html#return
Чтобы ответить на ваш вопрос, я бы ответил raise
, потому что он создан для ошибок по сравнению с return
. Кроме того, они одинаковы по скорости/эффективности.
Не уверен, что эффективность и процессорное время являются наиболее важными вещами.
В первую очередь необходимо понять цикл Django request-response cycle. Следующим шагом после return Response
(или raise Exception
) является не браузер на стороне клиента, а количество Middlewares, которые вы импортировали в ваше приложение. И эти Middlewares могут быть разными в зависимости от того, что происходит внутри View.
Когда вы поднимаете что-то, вы нарушаете этот поток цикла.
Django обрабатывает поднятое исключение, пишет дополнительные журналы ошибок, возвращает заданный ответ на ошибку на клиентскую сторону. Вам не нужно заботиться о том, чтобы все условия правильных ответов были выполнены, потому что ошибка уже произошла, она уже некорректна. В остальном возвращаемый Response будет доставлен на сторону клиента обычным способом. Django позаботится о том, чтобы все проверки и шаги были пройдены до того, как ответ достигнет клиента.
Если вам нужно экономить миллисекунды, выбирая между return / raise и глубоко задумываясь об эффективности, для начала перестаньте использовать Django. Серьезно. Это самый медленный фреймворк даже для python.