Насколько дорого стоит повышение в Питоне?

В процессе разработки с использованием 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.

Вернуться на верх