- Документы - На подписание дали два документа: Разрешение на обработку персональных данных и Соглашение о неразглашении (NDA). NDA в нашем случае с послаблениями, а именно, мы можем использовать собственно написанный код для предоставления работодателям или в обучающих целях. Тем не менее, публиковать полный код или результаты работы команды строго-настрого запрещено. Подписывал подобное в первый раз, предварительно связавшись с директором Академии LAD и уточнив, что мне можно рассказывать.
Потом была пара общих собраний, на которых в основном обсуждалась концепция проекта. Я на этих звонках сидел "ниже воды, тише травы", поскольку всё это для меня в новинку и, по правде говоря, мало что понимал в обсуждениях. Сидел, слушал, пытался уяснить и набирался опыта.
Объяснили, как работать в Mattermost и как будут распределяться задачи на SCRUM-доске. Придётся привыкать к нему, так как, не считая Telegram-чатов для "быстрого" реагирования, это должно стать основным место для обсуждений.
Продакты провели анализ конкурентов и предоставили варианты направления развития проекта.
Сейчас они продолжают исследования, для этого запустили опрос среди тех кто покупал курсы по обучению программированию себе или детям. Если есть желание помочь в исследовании, можете заполнить анкету по ссылке: https://docs.google.com/forms/d/e/1FAIpQLScmkxKpesSroNG0GYxuUS8ruOIjObQ1otITffpBoBPhFQvXBw/viewform
С бэками созванивались два раза.
Первый созвон был для знакомства с командой. На нём нужно было рассказать о себе. Я, конечно, волновался, потому что не очень понимал, что рассказать о себе. Но, послушав остальных, сумел кое-как рассказать о своем опыте и навыках. Команда подобралась разношерстная.
Второй созвон оказался интереснее и был посвящён обсуждению начала работы над проектом. Знания некоторых коллег впечатляют, но не могу сказать, чтобы я в целом в чём-то отставал, хотя теперь стало понятно, что в своем стеке надо подтянуть: работу с кастомной моделью пользователя и токенами аутентификации.
В самом начале определился лид команды - самый активный участник группы.
Сейчас, пока продакты исследуют рынок, а проджекты с аналитиками готовят документацию, перед нами стоит задача развернуть проект в репозитории и сделать базовую регистрацию, авторизацию и сброс пароля.
Определились с задачами:
- Организовать "основу" проекта и правила работы в репозитории.
- Сделать авторизацию и регистрацию с использованием Django REST Framework и JSON Web Token.
- Реализовать сброс пароля зарегистрированного пользователя.
Первую задачу взял на себя наш лид. После того, как он всё сделает, а мы это изучим, созвонимся снова и распределим оставшиеся задачи.
На удивление, мне есть, что предложить проекту, а именно у меня есть небольшой опыт работы с JWT аутентификацией между Django и Vue. Конечно, тут всё серьёзнее, чем на моём lkeep.ru, но, тем не менее, я не "хлопаю глазами" и не задаюсь вопросом "а как?".
В общем, наконец-то началось "движение". Очень интересно, в каком направлении пойдёт проект после исследования, какие задачи придётся выполнять и как будет выглядеть процесс взаимодействия с командой.
Пост на сайте
Поддержать проект
#Django #Стажировка #LAD_Academy #Backend #Код_на_салфетке #Frontend #Project #Product #Analytic #Vue
Потом была пара общих собраний, на которых в основном обсуждалась концепция проекта. Я на этих звонках сидел "ниже воды, тише травы", поскольку всё это для меня в новинку и, по правде говоря, мало что понимал в обсуждениях. Сидел, слушал, пытался уяснить и набирался опыта.
Объяснили, как работать в Mattermost и как будут распределяться задачи на SCRUM-доске. Придётся привыкать к нему, так как, не считая Telegram-чатов для "быстрого" реагирования, это должно стать основным место для обсуждений.
Продакты провели анализ конкурентов и предоставили варианты направления развития проекта.
Сейчас они продолжают исследования, для этого запустили опрос среди тех кто покупал курсы по обучению программированию себе или детям. Если есть желание помочь в исследовании, можете заполнить анкету по ссылке: https://docs.google.com/forms/d/e/1FAIpQLScmkxKpesSroNG0GYxuUS8ruOIjObQ1otITffpBoBPhFQvXBw/viewform
С бэками созванивались два раза.
Первый созвон был для знакомства с командой. На нём нужно было рассказать о себе. Я, конечно, волновался, потому что не очень понимал, что рассказать о себе. Но, послушав остальных, сумел кое-как рассказать о своем опыте и навыках. Команда подобралась разношерстная.
Второй созвон оказался интереснее и был посвящён обсуждению начала работы над проектом. Знания некоторых коллег впечатляют, но не могу сказать, чтобы я в целом в чём-то отставал, хотя теперь стало понятно, что в своем стеке надо подтянуть: работу с кастомной моделью пользователя и токенами аутентификации.
В самом начале определился лид команды - самый активный участник группы.
Сейчас, пока продакты исследуют рынок, а проджекты с аналитиками готовят документацию, перед нами стоит задача развернуть проект в репозитории и сделать базовую регистрацию, авторизацию и сброс пароля.
Определились с задачами:
- Организовать "основу" проекта и правила работы в репозитории.
- Сделать авторизацию и регистрацию с использованием Django REST Framework и JSON Web Token.
- Реализовать сброс пароля зарегистрированного пользователя.
Первую задачу взял на себя наш лид. После того, как он всё сделает, а мы это изучим, созвонимся снова и распределим оставшиеся задачи.
На удивление, мне есть, что предложить проекту, а именно у меня есть небольшой опыт работы с JWT аутентификацией между Django и Vue. Конечно, тут всё серьёзнее, чем на моём lkeep.ru, но, тем не менее, я не "хлопаю глазами" и не задаюсь вопросом "а как?".
В общем, наконец-то началось "движение". Очень интересно, в каком направлении пойдёт проект после исследования, какие задачи придётся выполнять и как будет выглядеть процесс взаимодействия с командой.
Пост на сайте
Поддержать проект
#Django #Стажировка #LAD_Academy #Backend #Код_на_салфетке #Frontend #Project #Product #Analytic #Vue
🔥8
Что выведет код выше?
Anonymous Quiz
12%
Всего 5 конфет.
45%
Всего 6 конфет.
15%
UnboundLocalError
28%
Ничего из перечисленного выше.
🔥1
Вчера мы опубликовали первую задачу из рубрики «Полезное из мешка». Задача скорее требовала внимательности, а не специальных знаний.
Общее количество ответов на данный момент 43, из них верных 11, а если вычесть 4-х человек, которые точно знали ответ на задачу, то правильных остаётся всего 7 ответов. Это даже меньше, чем если бы каждый отвечавший выбирал ответ случайным образом :(
Код из задачи:
Объяснение задачи:
В переменную
Функция
Функция
Хитрость в том, что функция
либо в этой:
Как вам новая рубрика? Стоит продолжать?
#что_выведет_данный_код #задачи_на_салфетке #python #функции #полезное_из_мешка
Общее количество ответов на данный момент 43, из них верных 11, а если вычесть 4-х человек, которые точно знали ответ на задачу, то правильных остаётся всего 7 ответов. Это даже меньше, чем если бы каждый отвечавший выбирал ответ случайным образом :(
Код из задачи:
def get_candy():
candy = 5
def increment_candy():
nonlocal candy
candy += 1
return candy
return increment_candy
result = get_candy()
print('Всего {} конфет.'.format(result))
Объяснение задачи:
В переменную
result мы помещаем результат вызова функции get_candy.Функция
get_candy: в ней мы объявляем переменную candy и записываем в неё пять конфет. Далее в ней же создается внутренняя функция increment_candy.Функция
increment_candy: в ней мы объявляем переменную candy нелокальной: то есть работая с этой переменной далее, мы будем обращаться к переменной из внешней функции get_candy - той самой, куда мы записали 5 конфет. Далее мы увеличиваем число конфет в этой переменной на единицу и возвращаем ее значение 6.Хитрость в том, что функция
get_candy (внешняя) не возвращает результат работы функции increment_candy (внутренней). Она лишь возвращает саму эту внутреннюю функцию, не вызывая ее. Чтобы вернуть именно результат ее работы, нужно вызвать эту внутреннюю фунцию, добавив скобки либо в этой строке:return increment_candy()
либо в этой:
result = get_candy()()
Как вам новая рубрика? Стоит продолжать?
#что_выведет_данный_код #задачи_на_салфетке #python #функции #полезное_из_мешка
🔥12
Статистика сайта за месяц 03.11-04.12
Автор: Иван Ашихмин
Прошёл ещё месяц и пора изучать статистику.
Растёт доля переходов из поиска. Основными поисковыми запросами по-прежнему являются AIOgram и FreeGPT, а в этом месяце к ним присоединились ещё и запросы про Docker (в основном MailServer) и стажировку в Aston. Удивительно, что на сайте столько постов про Django, а его в запросах почти нет.
Переходы из Telegram, Dzen и прямые заходы практически сравнялись.
В целом меня радует рост поисковой выдачи, но над SEO ещё работать и работать.
К слову, если кто-то из вас разбирается в SEO-оптимизации и сможет подсказать по основным моментам, как и что, буду благодарен 🙂.
В сухом итоге:
- Посетители: Было 500, стало 785. Прирост 57%.
- Переходы из Dzen: Было 12.6%, стало 13.1%. Прирост 3.96%.
- Переходы из Telegram-канала: Было 18%, стало 11.6%. Падение 35.55%.
- Переходы из поиска: Было 48.1%, стало 58.3%. Прирост 21.20%.
Автор: Иван Ашихмин
Прошёл ещё месяц и пора изучать статистику.
Растёт доля переходов из поиска. Основными поисковыми запросами по-прежнему являются AIOgram и FreeGPT, а в этом месяце к ним присоединились ещё и запросы про Docker (в основном MailServer) и стажировку в Aston. Удивительно, что на сайте столько постов про Django, а его в запросах почти нет.
Переходы из Telegram, Dzen и прямые заходы практически сравнялись.
В целом меня радует рост поисковой выдачи, но над SEO ещё работать и работать.
К слову, если кто-то из вас разбирается в SEO-оптимизации и сможет подсказать по основным моментам, как и что, буду благодарен 🙂.
В сухом итоге:
- Посетители: Было 500, стало 785. Прирост 57%.
- Переходы из Dzen: Было 12.6%, стало 13.1%. Прирост 3.96%.
- Переходы из Telegram-канала: Было 18%, стало 11.6%. Падение 35.55%.
- Переходы из поиска: Было 48.1%, стало 58.3%. Прирост 21.20%.
Релиз Django 5.0
Автор: Иван Ашихмин
Приветствую.
4 декабря, Django Team представили релиз фреймворка Django 5.0.
Примечания к выпуску подробно охватывают все изменения и новые функции, но вот несколько ключевых моментов:
- Значения по умолчанию, вычисляемые базой данных, позволяют определять значения по умолчанию, вычисляемые базой данных, для полей модели.
- Продолжая тенденцию расширения Django ORM, сгенерированное поле модели, позволяет создавать столбцы, сгенерированные базой данных.
- В шаблонную систему была добавлена концепция группы полей для упрощения отображения полей формы.
Список изменений Django 5.0 на русском языке
Установить Django 5.0 можно из PyPi или используя pip:
Автор: Иван Ашихмин
Приветствую.
4 декабря, Django Team представили релиз фреймворка Django 5.0.
Примечания к выпуску подробно охватывают все изменения и новые функции, но вот несколько ключевых моментов:
- Значения по умолчанию, вычисляемые базой данных, позволяют определять значения по умолчанию, вычисляемые базой данных, для полей модели.
- Продолжая тенденцию расширения Django ORM, сгенерированное поле модели, позволяет создавать столбцы, сгенерированные базой данных.
- В шаблонную систему была добавлена концепция группы полей для упрощения отображения полей формы.
Список изменений Django 5.0 на русском языке
Установить Django 5.0 можно из PyPi или используя pip:
pip install Django5.0
🔥3
Обратите внимание! При обновлении существующего проекта на более ранних версиях Django, удостоверьтесь, что используемые вами сторонние библиотеки поддерживают актуальную версию.
С выпуском Django 5.0 поддержка Django 4.2 завершена. Последний минорный релиз с исправлением ошибок, 4.2.8, был выпущен сегодня. Django 4.2 является версией с долгосрочной поддержкой (LTS) и будет получать исправления по безопасности и устранение потери данных до апреля 2026 года. Всем пользователям рекомендуется обновиться до этой даты, чтобы продолжать получать исправления для проблем безопасности.
Django 4.1 завершил свой период дополнительной поддержки. Последний релиз с исправлением безопасности (4.1.13) был выпущен 1 ноября. Всех пользователей Django 4.1 настоятельно рекомендуется обновиться до версии Django 4.2 или более поздней.
Пост на сайте
Поддержать проект
#Django #список_изменений #Новости #Django_5 #Django_4 #новая_версия #релиз
С выпуском Django 5.0 поддержка Django 4.2 завершена. Последний минорный релиз с исправлением ошибок, 4.2.8, был выпущен сегодня. Django 4.2 является версией с долгосрочной поддержкой (LTS) и будет получать исправления по безопасности и устранение потери данных до апреля 2026 года. Всем пользователям рекомендуется обновиться до этой даты, чтобы продолжать получать исправления для проблем безопасности.
Django 4.1 завершил свой период дополнительной поддержки. Последний релиз с исправлением безопасности (4.1.13) был выпущен 1 ноября. Всех пользователей Django 4.1 настоятельно рекомендуется обновиться до версии Django 4.2 или более поздней.
Пост на сайте
Поддержать проект
#Django #список_изменений #Новости #Django_5 #Django_4 #новая_версия #релиз
🔥3
Какой метод используется для сравнения двух объектов в Python, учитывая как их значения, так и их типы?
Anonymous Quiz
35%
equals()
19%
compare()
41%
__eq__()
5%
is_same()
В ближайшее время в рамках рубрики «Код в мешке» у нас выйдет пост о декораторах. А какую тему о Python вы бы хотели разобрать следом?
Anonymous Poll
9%
Области видимости
7%
Изменяемость/неизменяемость типов данных ч. 2
37%
Основы ООП ч. 1
33%
Сборщик мусора
14%
Хэшируемость объектов
0%
Напишу свой вариант в комментариях
🤔4🔥2
Оглавление для серии постов рубрики "Вести с полей стажировки".
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Тестовое задание для стажировки
Прошёл отбор на стажировку
Вести с полей стажировки
Начало работ
Второй месяц стажировки в LAD Academy
Первый фриланс проект - школа паралимпийского резерва
#стажировка #путь_в_it #оглавление
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Тестовое задание для стажировки
Прошёл отбор на стажировку
Вести с полей стажировки
Начало работ
Второй месяц стажировки в LAD Academy
Первый фриланс проект - школа паралимпийского резерва
#стажировка #путь_в_it #оглавление
🔥3
Оглавление для серии постов рубрики "Некий проект".
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Маленькая предыстория...
Зарождение проекта...
Первый созвон...
#некий_проект #оглавление
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Маленькая предыстория...
Зарождение проекта...
Первый созвон...
#некий_проект #оглавление
🔥2
Оглавление для серии постов рубрики "Boosty эксклюзив".
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram
Django - Добавление новой категории в форме создания поста без перезагрузки страницы
Отправка поста с Django в AIOgram - обновление
#boosty_эксклюзив #оглавление
Для удобства навигации по предстоящим материалам, в данном посте будут публиковаться ссылки на сообщения.
Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram
Django - Добавление новой категории в форме создания поста без перезагрузки страницы
Отправка поста с Django в AIOgram - обновление
#boosty_эксклюзив #оглавление
🔥3
Приветствую!
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:
"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Вести с полей стажировки."
"Некий проект"
"Код в мешке"
"Boosty эксклюзив"
Ресурсы канала:
Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK
Поддержка.
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
Также поддержать канал можно на Boosty.
Или внеся сайт в исключения вашего блокировщика рекламы.
В длинных постах можно запутаться поэтому, собираю воедино всё, что есть на данный момент.
Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:
"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Вести с полей стажировки."
"Некий проект"
"Код в мешке"
"Boosty эксклюзив"
Ресурсы канала:
Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK
Поддержка.
Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.
Также поддержать канал можно на Boosty.
Или внеся сайт в исключения вашего блокировщика рекламы.
🔥2
Декораторы в питоне
Декораторы в питоне
Авторы: Иван Ашихмин, Андрей Лебедев
Вы наверняка сталкивались с декораторами в Python, но знаете ли вы, как они работают? Можете без подсказки написать свой декоратор? А если вы только начинаете изучать Python и ещё не знакомы с ними, то не за горами тот момент, когда вы с ними так или иначе встретитесь, так почему бы не ускорить встречу?
Небольшое теоретическое вступление.
Прежде чем мы поговорим о декораторах, рассмотрим один небольшой, но важный нюанс, касающийся функций. Функции, как и всё в Python, являются объектами. И, как и любой другой объект, мы можем передавать функцию в качестве аргумента в другую функцию. Рассмотрим это на следующем примере.
Вот, что у нас здесь происходит:
Декораторы в питоне
Авторы: Иван Ашихмин, Андрей Лебедев
Вы наверняка сталкивались с декораторами в Python, но знаете ли вы, как они работают? Можете без подсказки написать свой декоратор? А если вы только начинаете изучать Python и ещё не знакомы с ними, то не за горами тот момент, когда вы с ними так или иначе встретитесь, так почему бы не ускорить встречу?
Небольшое теоретическое вступление.
Прежде чем мы поговорим о декораторах, рассмотрим один небольшой, но важный нюанс, касающийся функций. Функции, как и всё в Python, являются объектами. И, как и любой другой объект, мы можем передавать функцию в качестве аргумента в другую функцию. Рассмотрим это на следующем примере.
def func_one():
print("Как дела?”)
def func_two(func):
func()
func_two(func_one) # Как дела?
Вот, что у нас здесь происходит:
🔥4
1️⃣ Сначала мы создаем функцию
2️⃣Затем создаем вторую функцию
3️⃣ Последним действием вызовем функцию
Функции-обертки.
Давайте немного усложним рассматриваемую конструкцию:
1️⃣ Создаем функцию
2️⃣ Внутри функции
3️⃣ Функция
4️⃣ Создаем уже известную нам функцию
5️⃣ Вызываем функцию
Что же мы получим? Ничего. Всё дело в том, что функция
Вот теперь у нас всё заблестело и заискрилось: функция
А где же декораторы?
Терпение, спокойствие, сейчас они появятся.
Как нам сделать так, чтобы вызов функции
Решение как будто напрашивается: нам надо перезаписать в переменную
Еще раз: у нас была функция
А есть ли более удобный вариант записи для вызова функции декоратора? Есть - при помощи символа
Интересный факт: символ @, по мнению разработчиков, похож на пирог, от чего такой способ вызова декоратора назвали "Pie Decorator Syntax"
Полностью наш код будет выглядеть следующим образом:
func_one, которая выводит на печать строку “Как дела?”.2️⃣Затем создаем вторую функцию
func_two. Она принимает в качестве аргумента некоторую функцию func, которую в дальнейшем вызывает. Обратим внимание на то, что для передачи функции в качестве аргумента мы пишем только название функции - func, но на ставим скобки, так как в этот момент не вызываем ее.3️⃣ Последним действием вызовем функцию
func_two, передав в нее func_one. Как мы видим, func_one успешно вызывается внутри func_two, о чем и возвещает, интересуясь, как у нас дела.Функции-обертки.
Давайте немного усложним рассматриваемую конструкцию:
def deco(func):
def wrapper():
print("Привет!")
func()
print("Пока!")
return wrapper
def func_one():
print("Как дела?")
deco(func_one)
1️⃣ Создаем функцию
deco, в которую передадим в качестве аргумента некоторую функцию func.2️⃣ Внутри функции
deco создаем еще одну функцию wrapper. В ней сначала выводим на печать приветствие (“Привет!”), затем вызываем функцию func, которую получаем из внешней функции deco при помощи замыкания (обращения к объекту из внешней области видимости). Далее выводим на печать прощание (“Пока!”).3️⃣ Функция
deco возвращает функцию wrapper.4️⃣ Создаем уже известную нам функцию
func_one, вопрошающую, как дела.5️⃣ Вызываем функцию
deco.Что же мы получим? Ничего. Всё дело в том, что функция
deco возвращает функцию-обёртку wrapper, но не вызывает её. Чтобы заставить всю конструкцию работать, нам надо сделать кое-что странное: поставить после вызова функции deco дополнительную пару скобок.deco(func_one)()
# Привет!
# Как дела?
# Пока!
Вот теперь у нас всё заблестело и заискрилось: функция
wrapper, которую вернула нам вызванная функция deco, вызвалась дополнительной парой скобок и подарила нам короткий, но вежливый монолог: “Привет! Как дела? Пока!”.А где же декораторы?
Терпение, спокойствие, сейчас они появятся.
Как нам сделать так, чтобы вызов функции
func_one всегда сопровождался оборачиванием ее в функцию wrapper? Другими словами, как нам отдекорировать func_one, чтобы до вопроса о делах с нами здоровались, а после – прощались?Решение как будто напрашивается: нам надо перезаписать в переменную
func_one результат вызова функции deco с переданной в нее в качестве аргумента изначальной функцией func_one:func_one = deco(func_one)
Еще раз: у нас была функция
func_one. Мы обернули ее дополнительным кодом при помощи функции deco и в переменную func_one записали уже результат этого оборачивания. Теперь когда бы мы ни вызвали func_one, мы всегда получим усовершенствованный (отдекорированный) результат ее работы:func_one()
# Привет!
# Как дела?
# Пока!
А есть ли более удобный вариант записи для вызова функции декоратора? Есть - при помощи символа
@.Интересный факт: символ @, по мнению разработчиков, похож на пирог, от чего такой способ вызова декоратора назвали "Pie Decorator Syntax"
Полностью наш код будет выглядеть следующим образом:
def deco(func):
def wrapper():
print("Привет!")
func()
print("Пока!")
return wrapper
@deco
def func_one():
print("Как дела?")
func_one()
# Привет!
# Как дела?
# Пока!
🔥4⚡1
Результат работы этого кода точно такой же, просто синтаксис стал попроще и посимпатичнее. У большинства само понятие «декоратор» плотно ассоциируется с этим «пирожковым» оператором, но не самом деле декорирование - это не про синтаксис. Декорирование - это про принцип.
А что делать, если нам надо отдекорировать функцию, которая принимает какие-то аргументы?
В этой ситуации на помощь приходят звёздные братья
Мы передали в функцию
Вернёмся к нашим декораторам.
Допустим, что строку в нашей функции
1️⃣ В функцию-обертку (
2️⃣ В функцию
3️⃣ В декорируемую функцию передаем аргумент
В итоге всё работает ровно так, как мы и хотели, но функция и декоратор приобрели более универсальный вид.
Так что же такое декораторы?
Декоратор - это функция, которая позволяет нам "обернуть” кодом другую функцию, не изменяя при этом код самой оборачиваемой функции. Это даёт нам возможность выполнить какие-то дополнительные действия до и/или после выполнения самой оборачиваемой функции. Например, как в нашем примере выше, поздороваться перед тем, как сказать что-то, и попрощаться после этого. В принципе декораторы похожи на ритуалы, которые мы все выполняем в обычной жизни. Например, перед тем, как что-то съесть, мы моем руки. При этом неважно, из чего будет состоять трапеза: перед едой все хорошие мальчики и девочки обязательно вымоют руки - таков декоратор, обернувший функцию “поесть” в процессе воспитания в детстве.
Самым распространённым примером использования декоратора в коде является логгер. Он срабатывает при выполнении декорируемой функции и записывает в файл результат выполнения, а также сопутствующие данные, такие, как название функции, входные аргументы и другие.
Вообще декораторами бывают не только функции. В декоратор можно превратить целый класс, но об этом поговорим в отдельной статье.
А что делать, если нам надо отдекорировать функцию, которая принимает какие-то аргументы?
В этой ситуации на помощь приходят звёздные братья
*args и **kwargs. Многих начинающих питонистов эта парочка пугает, но на самом деле бояться здесь нечего. Это всего лишь синтаксис, который позволяет нам не уточнять, сколько аргументов мы хотим передать в функцию:*args кортежем передает в функцию любое количество позиционных аргументов (то есть тех, к которым внутри функции можно обратиться по позиции).**kwargs словарём передает в функцию любое количество именованных аргументов (то есть тех, к которым внутри функции можно обратиться по имени, или, другими словами, по ключу). Вот простенький пример, из которого всё должно стать понятно:def my_function(*args, **kwargs):
print(args[1])
print(kwargs[name])
my_function(1, 2, 3, name='John', age=25)
def my_function(*args, **kwargs):
print(args[1])
print(kwargs['name'])
my_function(1, 2, 3, name='Аристарх', age=25)
# 2
# Аристарх
Мы передали в функцию
my_function заранее неоговоренное количество позиционных (1, 2, 3) и именованных (name="Аристарх", age=25) аргументов. В самой функции по индексу 1 мы вызвали второй элемент кортежа позиционных аргументов (2) и по ключу "name" вызвали из словаря значение ("Аристарх"). Ничего сложного. Надо только следить за тем, чтобы в функции не вызывался аргумент с несуществующим индексом в кортеже или с несуществующим ключом в словаре. Иначе работа кода прервется исключением. Исключение, правда, можно и обработать, но об этом поговорим как-нибудь в другой раз.Вернёмся к нашим декораторам.
Допустим, что строку в нашей функции
func мы не прописываем уже внутри, а передаем в функцию позиционным аргументом. Тогда уже знакомый нам код изменится следующим образом:def deco(func):
def wrapper(*args, **kwargs):
print("Привет!")
func(*args, **kwargs)
print("Пока!")
return wrapper
@deco
def func_one(text):
print(text)
func_one("Как дела?")
# Привет!
# Как дела?
# Пока!
1️⃣ В функцию-обертку (
wrapper) мы записываем те самые *args и **kwargs2️⃣ В функцию
func внутри wrapper мы также их передаём.3️⃣ В декорируемую функцию передаем аргумент
textВ итоге всё работает ровно так, как мы и хотели, но функция и декоратор приобрели более универсальный вид.
Так что же такое декораторы?
Декоратор - это функция, которая позволяет нам "обернуть” кодом другую функцию, не изменяя при этом код самой оборачиваемой функции. Это даёт нам возможность выполнить какие-то дополнительные действия до и/или после выполнения самой оборачиваемой функции. Например, как в нашем примере выше, поздороваться перед тем, как сказать что-то, и попрощаться после этого. В принципе декораторы похожи на ритуалы, которые мы все выполняем в обычной жизни. Например, перед тем, как что-то съесть, мы моем руки. При этом неважно, из чего будет состоять трапеза: перед едой все хорошие мальчики и девочки обязательно вымоют руки - таков декоратор, обернувший функцию “поесть” в процессе воспитания в детстве.
Самым распространённым примером использования декоратора в коде является логгер. Он срабатывает при выполнении декорируемой функции и записывает в файл результат выполнения, а также сопутствующие данные, такие, как название функции, входные аргументы и другие.
Вообще декораторами бывают не только функции. В декоратор можно превратить целый класс, но об этом поговорим в отдельной статье.
🔥6