From e9fb5ff4d4ce4b6aa85ad6d6672615b4cb09e524 Mon Sep 17 00:00:00 2001 From: Denis Date: Wed, 17 Oct 2018 12:33:04 +0300 Subject: [PATCH 01/19] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D1=8F=D1=81=D0=BD=D1=8F=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 7ad73b2c..58e23870 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,12 @@ безгранично гибкий код — это как сферический конь в вакууме. Теоретически возможен, но практической ценности не несет. +Если мы заранее будем знать как изменятся требования к коду через год, два или +десять лет, то уже сейчас можно заложить необходимые механизмы расширения +функциональности. К сожалению, такие сведения сложно получить, а зачастую +просто невозможно. Приходится опираться на свой опыт, опыт товарищей, +прорабатывать разные сценарии развития проекта, подстраховываться. + Один из часто встречающихся и оправданных приемов — это отделение обработки данных от процесса ввода/вывода. Рассмотрим несколько примеров. @@ -108,3 +114,10 @@ days_before_start ? 1)от источника данных; 2)от формата вывода в файл. +Кроме того, часть кода удалось превратить в чистые функции, что облегчит +тестирование и повторное использование. + +Стратегия по отделению операций ввода/вывода от обработки данных встречается +повсеместно, в самых разных программах: от небольших скриптов до серьезных и +крупных проектов. Это один из базовых приемов, нужно уверенно им владеть. + From 52a1d2b42b14cd16e1b6a5d2b36b0cf7c751f898 Mon Sep 17 00:00:00 2001 From: Denis Date: Wed, 17 Oct 2018 12:33:38 +0300 Subject: [PATCH 02/19] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58e23870..5a2b6610 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ days_before_start ? 1)от источника данных; 2)от формата вывода в файл. -Кроме того, часть кода удалось превратить в чистые функции, что облегчит +Кроме того, часть кода удалось превратить в [чистые функции](https://devman.org/encyclopedia/decomposition/decomposition_pure_functions/), что облегчит тестирование и повторное использование. Стратегия по отделению операций ввода/вывода от обработки данных встречается From 4846789cce2932f1eae848269be88efd106e3eae Mon Sep 17 00:00:00 2001 From: Alina Date: Wed, 17 Oct 2018 12:34:44 +0300 Subject: [PATCH 03/19] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D1=83?= =?UTF-8?q?=20=D1=81=D0=BE=20=D1=81=D1=85=D0=B5=D0=BC=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7ad73b2c..c26851c5 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,4 @@ days_before_start ? 1)от источника данных; 2)от формата вывода в файл. +![alt text](https://devman.org/assets/images/7_40__data_flow.png) \ No newline at end of file From 4fb288681d3dac182c839de6afd30812775372d3 Mon Sep 17 00:00:00 2001 From: dvmn-tasks <44063469+dvmn-tasks@users.noreply.github.com> Date: Tue, 7 Jul 2020 15:10:43 +0300 Subject: [PATCH 04/19] Update image link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c26851c5..d3c84658 100644 --- a/README.md +++ b/README.md @@ -108,4 +108,4 @@ days_before_start ? 1)от источника данных; 2)от формата вывода в файл. -![alt text](https://devman.org/assets/images/7_40__data_flow.png) \ No newline at end of file +![image](https://dvmn.org/filer/canonical/1594117412/678/) From 2de798b246d91358fce8c759ce963eb50508c47b Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Fri, 1 Aug 2025 16:52:04 +0300 Subject: [PATCH 05/19] Revert "Update image link" This reverts commit 4fb288681d3dac182c839de6afd30812775372d3. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 60388a41..011006db 100644 --- a/README.md +++ b/README.md @@ -108,4 +108,4 @@ days_before_start ? 1)от источника данных; 2)от формата вывода в файл. -![image](https://dvmn.org/filer/canonical/1594117412/678/) +![alt text](https://devman.org/assets/images/7_40__data_flow.png) \ No newline at end of file From 005fbeb949a7093b59a1144eb97bb7b9e2461c7c Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:08:14 +0300 Subject: [PATCH 06/19] fix headline --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2ec80c6..078e38c1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Отделяйте ввод/вывод от обработки +Ввод/вывод vs Обработка данных Ключевой критерий качества кода — это стоимость внесения в него изменений. From 88a330655ef7e2756cf85114725adc684183fb1f Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:41:22 +0300 Subject: [PATCH 07/19] fix code --- README.md | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 078e38c1..265e0f0f 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,7 @@ данных от процесса ввода/вывода. Рассмотрим несколько примеров. Пример. Подбор онлайн-курса - - -По условию задачи нужно скачать из сети данные об онлайн-курсах, выбрать из -них лучшие и сохранить результат в xlsx файл. Вот фрагмент кода: +По условию задачи нужно скачать из сети данные об онлайн-курсах, выбрать из них лучшие и сохранить результат в xlsx файл. Вот фрагмент кода: def get_courses_list(courses_url): html = fetch_html(courses_url) @@ -24,34 +21,17 @@ def get_courses_list(courses_url): else: print("can't load list of courses") exit() -Теперь примерим на себя роль провидца и подумаем какой функционал потребуется -через месяц: - -В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем -подождать еще 30 секунд и так далее. -В случае если адрес недоступен - постучаться по другому url в зеркало сайта. -В случае ошибки сделать запись в лог и взять данные из ранее подготовленного -кеша. -Как все это сделать когда def get_courses_list сама завершает программу ?! От -вызова exit() надо отказаться. Можно выбросить исключение и таким образом -сообщить о проблеме внешнему коду, пускай там разбираются. - -Вызов print тоже стоит вынести из тела функции наружу. В рассмотренных -сценариях вывод в консоль зависит от общей логики загрузки данных и -многократных вызовов def get_courses_list. +Теперь примерим на себя роль провидца и подумаем какой функционал потребуется через месяц: + +В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем подождать еще 30 секунд и так далее. В случае если адрес недоступен - постучаться по другому url в зеркало сайта. В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. Как все это сделать когда def get_courses_list сама завершает программу ?! От вызова exit() надо отказаться. Можно выбросить исключение и таким образом сообщить о проблеме внешнему коду, пускай там разбираются. + +Вызов print тоже стоит вынести из тела функции наружу. В рассмотренных сценариях вывод в консоль зависит от общей логики загрузки данных и многократных вызовов def get_courses_list. Что еще может потребоваться в скором будущем? -Отладить и покрыть тестами парсер HTML страницы. -Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком -диске. -Ага, значит вызывать fetch_html() внутри def get_courses_list не такая уж -хорошая идея. Жить будет легче если передать в def get_courses_list строку с -HTML разметкой вместо courses_url. Вуаля, мы решили проблемы еще до их -появления на горизонте! +Отладить и покрыть тестами парсер HTML страницы. Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. Ага, значит вызывать fetch_html() внутри def get_courses_list не такая уж хорошая идея. Жить будет легче если передать в def get_courses_list строку с HTML разметкой вместо courses_url. Вуаля, мы решили проблемы еще до их появления на горизонте! Пойдем дальше. Код другой функции: - def get_course_info(html): # ... parsing logic From 448f427998c723b428b8ded6f9645fdb0af28239 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:44:12 +0300 Subject: [PATCH 08/19] fix code --- README.md | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 265e0f0f..94c552a1 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,13 @@ Один из часто встречающихся и оправданных приемов — это отделение обработки данных от процесса ввода/вывода. Рассмотрим несколько примеров. -Пример. Подбор онлайн-курса -По условию задачи нужно скачать из сети данные об онлайн-курсах, выбрать из них лучшие и сохранить результат в xlsx файл. Вот фрагмент кода: +# Пример. Подбор онлайн-курса + +По условию задачи нужно скачать из сети данные об онлайн-курсах, выбрать из +них лучшие и сохранить результат в xlsx файл. Вот фрагмент кода: + +```python def get_courses_list(courses_url): html = fetch_html(courses_url) if html: @@ -21,15 +25,32 @@ def get_courses_list(courses_url): else: print("can't load list of courses") exit() -Теперь примерим на себя роль провидца и подумаем какой функционал потребуется через месяц: - -В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем подождать еще 30 секунд и так далее. В случае если адрес недоступен - постучаться по другому url в зеркало сайта. В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. Как все это сделать когда def get_courses_list сама завершает программу ?! От вызова exit() надо отказаться. Можно выбросить исключение и таким образом сообщить о проблеме внешнему коду, пускай там разбираются. - -Вызов print тоже стоит вынести из тела функции наружу. В рассмотренных сценариях вывод в консоль зависит от общей логики загрузки данных и многократных вызовов def get_courses_list. +``` +Теперь примерим на себя роль провидца и подумаем какой функционал потребуется +через месяц: + +В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем +подождать еще 30 секунд и так далее. +В случае если адрес недоступен - постучаться по другому url в зеркало сайта. +В случае ошибки сделать запись в лог и взять данные из ранее подготовленного +кеша. +Как все это сделать когда def get_courses_list сама завершает программу ?! От +вызова exit() надо отказаться. Можно выбросить исключение и таким образом +сообщить о проблеме внешнему коду, пускай там разбираются. + +Вызов print тоже стоит вынести из тела функции наружу. В рассмотренных +сценариях вывод в консоль зависит от общей логики загрузки данных и +многократных вызовов def get_courses_list. Что еще может потребоваться в скором будущем? -Отладить и покрыть тестами парсер HTML страницы. Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. Ага, значит вызывать fetch_html() внутри def get_courses_list не такая уж хорошая идея. Жить будет легче если передать в def get_courses_list строку с HTML разметкой вместо courses_url. Вуаля, мы решили проблемы еще до их появления на горизонте! +Отладить и покрыть тестами парсер HTML страницы. +Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком +диске. +Ага, значит вызывать fetch_html() внутри def get_courses_list не такая уж +хорошая идея. Жить будет легче если передать в def get_courses_list строку с +HTML разметкой вместо courses_url. Вуаля, мы решили проблемы еще до их +появления на горизонте! Пойдем дальше. Код другой функции: def get_course_info(html): From ea518e2f48d9a22158067df53fb0050ae344df36 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:45:03 +0300 Subject: [PATCH 09/19] Revert "fix headline" This reverts commit 005fbeb949a7093b59a1144eb97bb7b9e2461c7c. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 078e38c1..d2ec80c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Ввод/вывод vs Обработка данных +Отделяйте ввод/вывод от обработки Ключевой критерий качества кода — это стоимость внесения в него изменений. From 437831f26a8eccce369b41e716454210f209d640 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:45:58 +0300 Subject: [PATCH 10/19] fix headline --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94c552a1..e16ad20a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Ввод/вывод vs Обработка данных +# Ввод/вывод vs Обработка данных Ключевой критерий качества кода — это стоимость внесения в него изменений. From 304134eafb1cc4aca9df2624333ea99bfb43e689 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 15:51:42 +0300 Subject: [PATCH 11/19] fix headline #2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e16ad20a..d59a2929 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Один из часто встречающихся и оправданных приемов — это отделение обработки данных от процесса ввода/вывода. Рассмотрим несколько примеров. -# Пример. Подбор онлайн-курса +## Пример. Подбор онлайн-курса По условию задачи нужно скачать из сети данные об онлайн-курсах, выбрать из From c55ea619af114d471fa5384c7adc7faaac707471 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 16:02:58 +0300 Subject: [PATCH 12/19] fix lists --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d59a2929..d142b433 100644 --- a/README.md +++ b/README.md @@ -34,22 +34,22 @@ def get_courses_list(courses_url): В случае если адрес недоступен - постучаться по другому url в зеркало сайта. В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. -Как все это сделать когда def get_courses_list сама завершает программу ?! От -вызова exit() надо отказаться. Можно выбросить исключение и таким образом +Как все это сделать когда `def get_courses_list` сама завершает программу ?! От +вызова `exit()` надо отказаться. Можно выбросить исключение и таким образом сообщить о проблеме внешнему коду, пускай там разбираются. -Вызов print тоже стоит вынести из тела функции наружу. В рассмотренных +Вызов `print` тоже стоит вынести из тела функции наружу. В рассмотренных сценариях вывод в консоль зависит от общей логики загрузки данных и -многократных вызовов def get_courses_list. +многократных вызовов `def get_courses_list`. Что еще может потребоваться в скором будущем? Отладить и покрыть тестами парсер HTML страницы. Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. -Ага, значит вызывать fetch_html() внутри def get_courses_list не такая уж -хорошая идея. Жить будет легче если передать в def get_courses_list строку с -HTML разметкой вместо courses_url. Вуаля, мы решили проблемы еще до их +Ага, значит вызывать `fetch_html()` внутри `def get_courses_list` не такая уж +хорошая идея. Жить будет легче если передать в `def get_courses_list` строку с +HTML разметкой вместо `courses_url`. Вуаля, мы решили проблемы еще до их появления на горизонте! Пойдем дальше. Код другой функции: From 9844cc0f89e7d08fde163bb755e33a4996a4a75f Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 16:51:49 +0300 Subject: [PATCH 13/19] fix code#3 and list#2 --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d6c6f2d5..f545f51a 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,10 @@ HTML разметкой вместо `courses_url`. Вуаля, мы решил появления на горизонте! Пойдем дальше. Код другой функции: +```python def get_course_info(html): # ... parsing logic - + rating = soup.find_all('div', attrs={'class': 'ratings-text'}) if rating: # check if rating is not empty list rating = rating[0].contents[0].text @@ -72,6 +73,7 @@ def get_course_info(html): # .... parsing logic return course_data +``` Что может произойти с кодом дальше? Если рейтинга нет — надо искать его на другом сайте. @@ -79,11 +81,11 @@ def get_course_info(html): Отчет о курсах без рейтинга выгружать в дополнительную вкладку xlsx, чтобы удобнее было руками проверять. Для всего этого нужно уметь отличать от прочих ситуацию "рейтинг неизвестен". -В Python для этих целей предусмотрено значение rating = None. А строку "No +В Python для этих целей предусмотрено значение `rating = None`. А строку "No rating yet" можно переместить туда где данные подготавливаются к выводу в xlsx. Та же функция, часть вторая, последняя: - +```python def get_course_info(html): # ... more parsing logic is here @@ -95,15 +97,16 @@ def get_course_info(html): '4_weeks': duration, "5_rating": rating } + ``` Сразу возникают вопросы. А если нужна еще одна выгрузка в формате csv, с -другим порядком столбцов, как это сделать? Как заменить столбец 2_date на -days_before_start ? +другим порядком столбцов, как это сделать? Как заменить столбец `2_date` на +`days_before_start` ? Кроме того, наперед известно, что пользовательский интерфейс — будь то вывод в консоль или запись в файл — меняется очень часто. Было бы удобно собрать все, что относится к форматированию вывода в одном месте. Например, всю логику -выгрузки в xlsx поместить в def fill_xlsx(workbook, courses):, а вывод в -консоль собрать внутри if __name__=='__main__':. Удастся избежать вычитывания +выгрузки в xlsx поместить в `def fill_xlsx(workbook, courses):`, а вывод в +консоль собрать внутри `if __name__=='__main__':`. Удастся избежать вычитывания и повторной отладки всей программы от начала до конца, ведь изменения локальны и изолированы. From 82e408d48d138923a229f08de5e74ddae8a4d606 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Sat, 2 Aug 2025 17:04:05 +0300 Subject: [PATCH 14/19] fix headline #3 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f545f51a..5c0e24b5 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,13 @@ def get_course_info(html): и повторной отладки всей программы от начала до конца, ведь изменения локальны и изолированы. -Вместо заключения +## Вместо заключения В результате мы пришли к ситуации, когда логика обработки данных слабо зависит: 1)от источника данных; + 2)от формата вывода в файл. ![alt text](https://devman.org/assets/images/7_40__data_flow.png) From cc9ecbaf72947de8fe5821615fb61c4189b72af9 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Mon, 4 Aug 2025 13:25:54 +0300 Subject: [PATCH 15/19] fix lists#4 --- README.md | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5c0e24b5..a3b26b4c 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,13 @@ def get_courses_list(courses_url): Теперь примерим на себя роль провидца и подумаем какой функционал потребуется через месяц: -В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем -подождать еще 30 секунд и так далее. -В случае если адрес недоступен - постучаться по другому url в зеркало сайта. -В случае ошибки сделать запись в лог и взять данные из ранее подготовленного -кеша. + 1.В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем + подождать еще 30 секунд и так далее. + + 2.В случае если адрес недоступен - постучаться по другому url в зеркало сайта. + + 3.В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. + Как все это сделать когда `def get_courses_list` сама завершает программу ?! От вызова `exit()` надо отказаться. Можно выбросить исключение и таким образом сообщить о проблеме внешнему коду, пускай там разбираются. @@ -50,9 +52,10 @@ def get_courses_list(courses_url): Что еще может потребоваться в скором будущем? -Отладить и покрыть тестами парсер HTML страницы. -Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком -диске. + 1.Отладить и покрыть тестами парсер HTML страницы. + + 2.Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. + Ага, значит вызывать `fetch_html()` внутри `def get_courses_list` не такая уж хорошая идея. Жить будет легче если передать в `def get_courses_list` строку с HTML разметкой вместо `courses_url`. Вуаля, мы решили проблемы еще до их @@ -76,10 +79,13 @@ def get_course_info(html): ``` Что может произойти с кодом дальше? -Если рейтинга нет — надо искать его на другом сайте. -В xlsx указывать не просто отсутствие рейтинга, а еще на каких сайтах искал. -Отчет о курсах без рейтинга выгружать в дополнительную вкладку xlsx, чтобы -удобнее было руками проверять. + 1.Если рейтинга нет — надо искать его на другом сайте. + + 2.В xlsx указывать не просто отсутствие рейтинга, а еще на каких сайтах искал. + + 3.Отчет о курсах без рейтинга выгружать в дополнительную вкладку xlsx, чтобы + удобнее было руками проверять. + Для всего этого нужно уметь отличать от прочих ситуацию "рейтинг неизвестен". В Python для этих целей предусмотрено значение `rating = None`. А строку "No rating yet" можно переместить туда где данные подготавливаются к выводу в xlsx. @@ -115,9 +121,9 @@ def get_course_info(html): В результате мы пришли к ситуации, когда логика обработки данных слабо зависит: -1)от источника данных; + 1. от источника данных; -2)от формата вывода в файл. + 2.от формата вывода в файл. ![alt text](https://devman.org/assets/images/7_40__data_flow.png) From c04372bc4e66b8a0e01721a588d71dd556177bbe Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Mon, 4 Aug 2025 13:30:31 +0300 Subject: [PATCH 16/19] fix lists #4 --- README.md | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index a3b26b4c..b4685d1b 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,10 @@ def get_courses_list(courses_url): Теперь примерим на себя роль провидца и подумаем какой функционал потребуется через месяц: - 1.В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем - подождать еще 30 секунд и так далее. - - 2.В случае если адрес недоступен - постучаться по другому url в зеркало сайта. - - 3.В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. + 1. В случае сетевой ошибки взять паузу в 10 секунд и повторить попытку, затем + подождать еще 30 секунд и так далее. + 2. В случае если адрес недоступен - постучаться по другому url в зеркало сайта. + 3. В случае ошибки сделать запись в лог и взять данные из ранее подготовленного кеша. Как все это сделать когда `def get_courses_list` сама завершает программу ?! От вызова `exit()` надо отказаться. Можно выбросить исключение и таким образом @@ -52,9 +50,8 @@ def get_courses_list(courses_url): Что еще может потребоваться в скором будущем? - 1.Отладить и покрыть тестами парсер HTML страницы. - - 2.Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. + 1. Отладить и покрыть тестами парсер HTML страницы. + 2. Ускорить работу скрипта, хранить ранее скачанные страницы в кеше на жестком диске. Ага, значит вызывать `fetch_html()` внутри `def get_courses_list` не такая уж хорошая идея. Жить будет легче если передать в `def get_courses_list` строку с @@ -79,11 +76,9 @@ def get_course_info(html): ``` Что может произойти с кодом дальше? - 1.Если рейтинга нет — надо искать его на другом сайте. - - 2.В xlsx указывать не просто отсутствие рейтинга, а еще на каких сайтах искал. - - 3.Отчет о курсах без рейтинга выгружать в дополнительную вкладку xlsx, чтобы + 1. Если рейтинга нет — надо искать его на другом сайте. + 2. В xlsx указывать не просто отсутствие рейтинга, а еще на каких сайтах искал. + 3. Отчет о курсах без рейтинга выгружать в дополнительную вкладку xlsx, чтобы удобнее было руками проверять. Для всего этого нужно уметь отличать от прочих ситуацию "рейтинг неизвестен". @@ -121,9 +116,8 @@ def get_course_info(html): В результате мы пришли к ситуации, когда логика обработки данных слабо зависит: - 1. от источника данных; - - 2.от формата вывода в файл. + 1. от источника данных; + 2. от формата вывода в файл. ![alt text](https://devman.org/assets/images/7_40__data_flow.png) From 370ca34cd2090f730b0c3de3fe3482e6348161b6 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Mon, 4 Aug 2025 13:32:50 +0300 Subject: [PATCH 17/19] fix picture --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b4685d1b..f63fdbac 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,8 @@ def get_course_info(html): 1. от источника данных; 2. от формата вывода в файл. -![alt text](https://devman.org/assets/images/7_40__data_flow.png) +image + Кроме того, часть кода удалось превратить в [чистые функции](https://devman.org/encyclopedia/decomposition/decomposition_pure_functions/), что облегчит тестирование и повторное использование. From 08a62b9272c365d31d59345ace437b2fdfb819ea Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Mon, 4 Aug 2025 13:33:30 +0300 Subject: [PATCH 18/19] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f63fdbac..88b9c6fb 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ def get_course_info(html): 1. от источника данных; 2. от формата вывода в файл. + 3. image From 6c5cbee6f3d005c22905ca4b4366d3aa781d8bf7 Mon Sep 17 00:00:00 2001 From: Pavelwell7 Date: Mon, 4 Aug 2025 13:34:13 +0300 Subject: [PATCH 19/19] fix lists#5 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 88b9c6fb..ed854e1b 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ def get_course_info(html): 1. от источника данных; 2. от формата вывода в файл. - 3. + image