Заброшенное в карантин: Pepperoni
Слишком много времени, слишком мало терпения
Если убрать из жизни дорогу на работу/с работы, «пойти в кафе», и «поехать в центр, чтобы повидаться с друзьями», то остаётся много свободного времени. Полностью занимать его «поглощением контента» (будь то кино/сериалы, книги, подкасты, музыка…) кажется нездоровым, игр надолго не хватает, звонки «как жизнь? — по большому счёту, так же, как и последние пять месяцев1» быстро надоедают…
Так что мой выбор яда хобби — это делать то же самое, что на работе, но для себя. А так как для себя, то больше никому не надо чтобы я довёл дело до конца2
Например, никто не будет подталкивать добить до конца выступление для митапа, который должен был пройти в марте
или дописать-таки кучу слов про code review
или причесать вроде юзабельный (хоть и довольно бесполезный) side project для публики
Но всё это можно похоронить заморозить в бложек. Авось даже в сыром виде оно кому-то пригодится
Начну с выступления для Python митапа…
Pitch
Суть: сделать что-то полезное исключительно средствами стандартной библиотеки Python
Почему: легче разворачивать, распространять, меньше поддерживать (потому что меньше обновляемых частей)
Что делаем: мониторинг веб-страниц на обновление. Юзер вбивает ссылку и опциональный фильтр для данных, а скрипт периодически пингует страницу и уведомляет об изменениях
Структура выступления: преподнести процесс написания скрипта как процесс готовки еды, с модулями как ингредиентами. Наиболее подходящим “блюдом” показалась пицца
На что хватило?
Сил и времени перед отменой митапа хватило на написание outline’а и самого скрипта, который даже пригодился когда ждал замены батарейки в телефоне:
По outline’у, все импорты разделил на четыре группы:
# spices
import os
import time
import platform
# sause
import re
import difflib
import textwrap
import html.parser
# meat
import urllib.request
# dough
import logging
import argparse
- мясо3 — основная часть скрипта, которую выполняет
urllib.request
- тесто — интерфейс, за который юзер будет «держать» скрипт
logging
для красивого вывода с таймстампамиargparse
для ввода опций для «соуса»
- соус — всякая «вкусовщина», без которых «мясо» будет съедобно, но не то. В основном, это удобства для «что отслеживать на странице?»
- специи — модули, которые пойдут в «любое блюдо». А правильно применённые специи могут быть небольшим «секретным ингредиентом», вроде звукового уведомления:
if platform.system() == "Darwin":
parser.add_argument(
"--sound",
"-s",
dest="mac_sound",
default="pop",
# `ls /System/Library/Sounds/`
choices=[
"basso",
"blow",
"bottle",
"frog",
"funk",
"glass",
"hero",
"morse",
"ping",
"pop",
"purr",
"sosumi",
"submarine",
"tink",
],
type=str,
help="sound to play (macOS only)",
)
if mac_sound:
os.system(
f"afplay /System/Library/Sounds/{mac_sound.title()}.aiff 2> /dev/null"
)
else:
print("\a", end="", flush=True)
Кроме этих четырёх ингредиентов, хотел упомянуть что в стандартной библиотеке есть «кухонные приборы» — модули вроде doctest
, которые упрощают разработку:
def query_html(html, query, regex):
"""
>>> html = "<ul><li>A</li><li id='b'>B</li></ul><ol><li>C</li><li class='d'>D</li></ol>"
>>> query_html(html, "li", None)
'A'
>>> query_html(html, "#b", None)
'B'
>>> query_html(html, "ol li", None)
'C'
>>> query_html(html, ".d", None)
'D'
>>> query_html(html, "ul li", "B|X")
'B'
>>> query_html(html, "ol li", "B|X")
"""
if query:
html_parser = HTMLParser(query, regex)
html_parser.feed(html)
return html_parser.match
elif regex:
match = re.search(regex, html)
if match:
return match.group(0)
return None
После всего этого кода, в качестве outro, сказал бы о штуках, которых не хватает (вроде форматтера и хоть какой-то работы с изображениями), плюс отметил бы что
Конечно, в PyPI можно добыть ингредиенты покачественнее:
re
->regex
argparse
->click
urllib.request
->request
html.parser
->BeautifulSoup
Но и стандартного набора более чем достаточно для вкусного блюда
Исходники всего скрипта доступны на гитхабе и здесь
Спасибо, что дочитали до конца
Уже пять месяцев?.. Чёёёёёрт… ↩︎
Или не забросил начинания как, честно говоря, забросил готовку дома. Ну, то есть, готовлю чаще, чем в "Before Times", но намного меньше, чем в момент написания той заметки ↩︎
или «мясо + сыр», или «протеин»… ↩︎