Вероятно, почти каждый разработчик на Python сталкивался с декораторами, видя конструкцию с со знаком @:
@app.route('/') def index(): return "Hello, World!"
Разберемся, что такое декоратор, и как он работает. Этот вопрос часто спрашивают на собеседованиях.
Декоратор – это функция, которая принимает как аргумент другую функцию*. Цель декоратора – расширить функциональность переданной ему функции без непосредственного изменения кода самой функции. Вот и все!
* Примечание: декорировать можно и класс, но об этом расскажу потом!
В Python функция – тоже объект, и ее можно передавать как аргумент, возвращать из другой функции, ей также можно назначать атрибуты.

Символ собачка (@) – всего лишь синтаксический сахар:
@decorator def foo(): ... # эквивалентно: def foo(): ... foo = decorator(foo)