import __hello__
277 subscribers
16 photos
55 links
Канал про IT, здебільшого WEB та Python, але буває й у інші теми заносить
Download Telegram
Мені подобається у якому напрямку рухається розвиток Python зараз.
Як на мене, нагальної потреби у додаванні нових фічей у мову зараз немає - вона вже досить давно є зрілою і містить достатню кількість мовних фічей (деякі із котрих можливо треба б було задепрекейтити і видалити)
І те що вже декілька версій у пайтон не додається багато нових можливостей (маю на увазі різний синтаксичний цукор) а навпаки core-розробники сконцентрували свою уваги над поліруванням того що є (покращують REPL, роблять повідомлення про помилки більш інформативними, видалять застарілі частини стдлібу, тощо) та над прискоренням CPython (nogil, JIT, subinterpreters, та звичайні оптимізації) як на мене дуже гарний знак того що у мови буде ще багато років планомірного розвитку.

Ось і новий реліз йде у сторону поліпшення швикодії та покращення developer expirience:

https://www.youtube.com/watch?v=gqqgwyNx52Q
👍155
Якось випадково натрапив на відос "Why don't Americans use electric kettles?" (ютуб рекомендації іноді підкидають щось неочікуване) і залип.
Саме так виглядав би ютуб канал гіка з 60х 😁. Автор бере якусь стару технологію і розповідає про неї так нібито це щойно презентований айфон чи макбук "The Antique Toaster that's Better than Yours"

Або ось він досліджував наскільки сильно зовнішні навіси на вікна охолоджують будинок у літню спеку і чому їх більше не використовують, чи про проблеми які зʼявились у інженерів котрі проєктують автомобільні стоп-сигнали із появою електрокарів.
Коротше якщо вам також подобаються гіковскі відоси із акцентом на старі технології - дуже рекомендую

Лінки:
- https://www.youtube.com/@TechnologyConnections
👍13🔥4💩1
Стаття про фічі нового Python 3.13. Ні, не про noGIL, JIT та інше, а про зміни які ви скоріш за все оминули увагою

https://www.bitecode.dev/p/python-313-what-didnt-make-the-headlines
👍9
Мене завжди дивує що у розмовах про дивацтва JavaScript обовʼзково згадують про те що 0.1 + 0.2 != 0.3, хоча насправді ця "проблема" є не лише у JS, це наслідок того як компʼютер представляє числа із плаваючою точкою.

Така ж ситуація із "дивацтвом" Пайтона коли хтось вперше бачить що all([]) is True і, не розуміючи чому так, відносить це до категорії unexpected behaviour.

Але це буквально 2500-річна філософська дискусія. Античні філософи вважали, що твердження 'всі єдинороги блакитні' має бути хибним, бо єдинорогів не існує, але сучасна логіка стверджує, що це істина, оскільки не існує єдинорогів, які не є блакитними. Python просто слідує сучасній предикатній логіці, але інша точка зору (у нашому випадку що all([]) має бути False як і порожній список) також досить поширена і була загальноприйнятою позицією до останніх кількох сотень років.

Але ми не філософи, ми програмісти, тому краще подивитись на більш практичні приклади:


all([]) # True
any([]) # False
math.prod([]) # 1
sum([]) # 0
max([]) # ValueError!


Справа у тому що ці функції реалізують концепцію з теорії категорій - моноїд.

Коли ми працюємо зі списками, нам важливо щоб операції над ними працювали передбачувано. Наприклад, якщо у нас є два списки xs та ys, то:

>>> from math import prod
>>> prod(xs + ys) == prod(xs) * prod(ys)
True
>>> sum(xs + ys) == sum(xs) + sum(ys)
True


А тепер цікавий момент - що буде якщо ys буде порожнім списком? Тоді:

prod(xs) == prod(xs + []) == prod(xs) * prod([])


Це рівняння може бути правдивим тільки якщо math.prod([]) == 1! Тобто одиниця тут виступає як нейтральний елемент для множення. У цього навіть є своє імʼя - порожній добуток (empty product).

Те саме і з іншими функціями:
- sum([]) == 0, бо 0 - нейтральний елемент для додавання
- all([]) == True, бо True - нейтральний елемент для and
- any([]) == False, бо False - нейтральний елемент для or

А от max() такого елемента не має! Не існує такого числа n, для якого max(x, n) == x для будь-якого x. Саме тому max([]) викидає помилку.

Доречі у цього явища є своє імʼя - вакуумна істина (vacuous truth). Це коли вираз вважається істинним, оскільки його умова не має сенсу.

Лінки:
- https://uk.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%97%D0%B4
- https://en.wikipedia.org/wiki/Empty_product
- https://en.wikipedia.org/wiki/Vacuous_truth
- https://news.ycombinator.com/item?id=37264149
- https://buttondown.com/hillelwayne/archive/why-any-is-true-prod-is-1-etc
👍19🔥10
import __hello__
Ну що, івент скінчився, а мене цьогоріч вистачило на вдвічі більший період ніж минулого року 😁 Якщо у минулому році я знудився вже на 12 день, то у цей раз я майже всі завдання зробив, лише з 21 дня не виконував 2 частину бо почались NP-Hard задачі, а я таке…
Ну що, розпочався черговий Advent of Code - гарний спосіб відволіктись від буденного життя і отримати трохи новорічного настрою.

Цей івент також може стати гарною нагодою вивчити\підтягнути нову мову програмування (чи навіть технологію, бачив пости де чуваки боролись із aoc у Excel). Я хотів aoc2024 вирішувати на Go, але розумію що цього року у мене набагато менше вільного часу ніж минулоріч, тому знову озброюсь пайтоном, бо це для мене найшвидший спосіб вирішувати задачки.

Сьогоднішній день досить легкий, навідміну від 2023 року, тому не має одразу відпугнути нових учасників 😁

Доречі не забувайте заходити на reddit, після того як вирішете задачки дня, за мемами ☺️
👍9🔥1
import __hello__
Ну що, розпочався черговий Advent of Code - гарний спосіб відволіктись від буденного життя і отримати трохи новорічного настрою. Цей івент також може стати гарною нагодою вивчити\підтягнути нову мову програмування (чи навіть технологію, бачив пости де чуваки…
Це перший рік коли я закінчив івент день у день і на всі 50 зірочок. Цього року навіть вдалось підбити декількох знайомих також приймати участь, тому було цікавіше ніж зазвичай.

Мені сподобалось, із плюсів участі у таких івентах можу назвати:
- трохи тримає тебе у "програмерскій формі", якщо немає звички й так протягом року задротити літкод
- дізнаєшся про різні цікаві проблеми і алгоритми із реального життя. Наприклад цьогоріч я дізнався про алгоритм Брона-Кербоша
- а у минулому році дізнався про крутезний блог https://www.redblobgames.com коли шукав інформацію про Дейкстра та A* алгоритми

Із мінусів - коли день не можеш вирішити пазл, а виявляється що у описі не було вказано якоїсь важливої деталі, чи просто текст був по дибільному написан 😄

Коротше прикольний івент, допомагає якось відволіктись та підготуватись до пошуку нової роботи згадати що програмування це не лише перекладання джейсончиків із бази у http-api 😁
👍134🎉3🎄3🔥2🏆1
З НР!🎄
14👍10🍾5
Якщо ви використовуєте pickledb (сподіваюсь що для прототипів, а не для "продакшену"), то для вас новина: її автор випустив вдосконалену версію - kenobiDB, він каже що це більш пропрацьована тред та процес безпечна документна база даних котру він сам використовує у своїх прототипах (а про pickledb він пише "what I now consider very stupid and useless" 🙃).

І якщо ми вже згадали embeded бази даних для пайтону, то щоб два рази не вставати давайте я залишу перелік тих про котрі знаю і котрими користувався (інколи із них дуже зручно почати MVP а потім перемкнути імплементацію на щось "доросле", якщо у цьому буде потреба)

1. montydb

Embeded база даних "яка виглядає і працює як MongoDB". Із документації - лише рідмі у проєкті 😄


>>> from montydb import MontyClient

>>> col = MontyClient(":memory:").db.test
>>> col.insert_many( [{"stock": "A", "qty": 6}, {"stock": "A", "qty": 2}] )
>>> cur = col.find( {"stock": "A", "qty": {"$gt": 4}} )
>>> next(cur)
{'_id': ObjectId('5ad34e537e8dd45d9c61a456'), 'stock': 'A', 'qty': 6}


2. tinydb

Проєкт яким надихався montydb - теж embeded, теж документоорієнтовна, вміє бути drop-in заміною монги через екстеншен tinymongo. Навідміну від montydb має документацію та більшу кількість підтримки на гітхабі (зірочки, коміти, котрибутори)


>>> from tinydb import TinyDB, Query
>>> db = TinyDB('/path/to/db.json')
>>> db.insert({'int': 1, 'char': 'a'})
>>> db.insert({'int': 1, 'char': 'b'})


3. mongita

Mongita is to MongoDB as SQLite is to SQL. Ще одна ліба котра намагається бути заміною монги, але останній коміт у репі був аж 2 роки тому.


>>> from mongita import MongitaClientDisk
>>> client = MongitaClientDisk()
>>> hello_world_db = client.hello_world_db
>>> mongoose_collection = hello_world_db.mongoose_collection
>>> mongoose_collection.insert_many([{'name': 'Meercat', 'does_not_eat': 'Snakes'},
{'name': 'Yellow mongoose', 'eats': 'Termites'}])


Лінки:
- https://github.com/patx/kenobi
- https://www.reddit.com/r/Python/comments/1hqvrd6/kenobidb_30_made_public_pickledb_replacement/
- https://github.com/davidlatwe/montydb
- https://github.com/msiemens/tinydb
- https://github.com/scottrogowski/mongita
👍7🔥2
😁17🤔1👀1
І так всюду і з усім 🙂
😁19
Ого, не знаю що сталось, але MongoDB випустили офіційний бекенд для Django. Він поки що Public Preview та рекомендований лише для ознайомлення.
Прям максимально неочікувана новина для мене, бо, принаймні у моїй бульбашці, джанго потихеньку здає позиції і все частіше замість неї обирать FastAPI або ще якийсь із сотні асинхронних мікрофреймворків. До того ж дивно чого саме бекенд для Джанги, а не для SqlAlchemy? Але прикольно - якщо дотягнуть до реліза то популярність Джанги може трошки знову піти вгору 😅

Лінки:
- https://www.mongodb.com/docs/languages/python/django-mongodb/current/
- https://github.com/mongodb/django-mongodb-backend
- https://www.mongodb.com/blog/post/mongodb-django-backend-now-available-public-preview
👍131
Останній місяць писав дуже багато документації із Sphinx, у форматі reStructuredText. Це формат придуманий у екосистемі пайтона - на ньому написана уся пайтонівська документація, це основна мова розмітки для описів пакетів у PyPi і т.д.
Головний, як то кажуть, selling point, цієї розмітки у тому що невідрендерений документ, себто у сирому вигляді, має добре парситись оком. Саме тому у ньому заголовки зроблені через підкреслення, тайтл лінки можні відділяти від самої лінки і тд.

Чи то через сам Sphinx, чи то через ергономічність reST, але я прям кайфую коли пишу документацію у цьому форматі, чи то через процес чи через результат. І ось коли писав чергову сторінку і пішов подивитись у Cheat Sheet, зрозумів що хотілось би якоїсь інтерактивної доки для reST, інтерактивної по типу https://pythontutor.com/, або https://mypy-play.net/. Щоб можна було потикати приклади прям у браузері і одразу бачити результат. Але нажаль окрім офф доки нічого більш не знайшов. Та коли це нас стримувало - тож я зафігачив свій туторіал, який працює без бекенда - повністю у браузері, ще й "на решту" зробив плейграунд, із можливістю шерінгу (вийшло щось типу pastebin).

Працювати без бекенду воно може завдяки PyScript - це штука котра через pyodide вміє ранити пайтон у браузері і надає апі для маніпулювання DOM-деревом. Трошки заморочившись можна навіть обійтись без CDN і зробити цю штуку офлайновою (у моєму випадку - не залежити від CDN а роздавати усе що треба для туторіала із свого сервера). Для цього щоправда треба трошки поприсідати, бо всі файли треба витягувати вручну із встановлених npm пакетів, але завдяки докеру це можна зробити досить просто: docker run --rm -it -v $(pwd):/code -w /code node bash.

Тож щоб запускати пайтон скрипти у браузері треба підключити у html файлі бандл пайскріпта (взагалі CDN, але у моєму випадку файлики які я сам роздаю)


<script type="module" src="/pyscript/core.js"></script>
<link rel="stylesheet" href="/pyscript/core.css">

<script type="py" src="./main.py" config="./pyscript.toml"></script>


pyscript.toml виглядає так:


name = "reStructuredText Tutorial"
description = "RST tutorial app"
# так як я хочу роздавати бандл пайскрипту сам - прописую шлях до нього
interpreter = "/pyodide/pyodide.mjs"
# ці пакети PyScript сам витягне із інтернету при старті, але іх можна роздавати
# і самому, щоб взагалі не залежити від зовнішніх ресурсів
packages = ["docutils", "pygments", "lzma"]


У html можна навішувати івенти через атрибути, <textarea py-input="_render_rst_from_input_debounced"></textarea>, де _render_rst_from_input_debounced це назва функції у main.py

Спочатку я зробив кожен урок туторіала окремою сторінкою, на яку мав навігувати браузер сам, але інтерпретатор стартує не миттєво і ця затримка при перемиканні між вправами дуже відчувається.
Тож прийшлось зробити SPA на мінімалках - PyScript разом із Pyodide завантажується один раз, а навігація відбувається вже самою апкою через підміну частин сторінки і відсдідковування івента "popstate".

Із кнопкою "Share" у плейграунді вийшло прикольно - можна ділитись документом, але сам документ мені ніде зберігати не потрібно - текст написаний у полі вводу стискається, пакується у base64 і вставляється у URL, тож посилання збергіє у собі весь текст і навіть якщо цей сервіс раптом буде недоступний - маючи посилання можна із нього дістати текст вручну. Приклад посилання:
https://rst-tutorial.yakimka.me/playground?paste=_Td6WFoAAATm1rRGAgAhARYAAAB0L-Wj4ABNAD5dAB7r_UTECOiaAZNIfAWoaP1gjlgAhbSC1dTSjED1rIQXc6T3aTSyiu8C_wll5dYjrwFJZQEcq5rmMFbwrvwAAAAA5PjAT436nmgAAVpOYmy28R-2830BAAAAAARZWg%3D%3D

Прикольна технологія, звісно для "заміни js у браузері" воно так собі підходить, а от робити якісь штуки яким треба пайтонівська ліба, аналогів якої немає у npm - саме те (цікаво, чи можна запустити веб сервер у браузері? 😁)

Лінки:
- https://rst-tutorial.yakimka.me/
- https://rst-tutorial.yakimka.me/playground
- https://www.sphinx-doc.org/en/master/
- https://docutils.sourceforge.io/docs/index.html
- https://pyscript.net/
- https://docs.pyscript.net/2025.3.1/user-guide/offline/
🔥10👍8💊3
Microsoft скасувала фінансування проєкта Faster CPython і звільнила частину команди (як я зрозумів, тих кого не звільнили - розподілять по іншим проєтам). Причому лист про звільнення надіслали коли команда була на пів-шляху до PyCon Pittsburg.
🫠😥
😢15🤬1🌚1
import __hello__
Microsoft скасувала фінансування проєкта Faster CPython і звільнила частину команди (як я зрозумів, тих кого не звільнили - розподілять по іншим проєтам). Причому лист про звільнення надіслали коли команда була на пів-шляху до PyCon Pittsburg. 🫠😥
Щось про це Гвідо мовчить, але він репостнув ось що: у липні вийде документалка про Python 🐍

The full film features: Barry Warsaw, Brett Cannon, @drewhouston, @gvanrossum, @gutworth, @jessicamckellar, Lambert Meertens, Lisa Guo, Lisa Roach, @mariatta, @mitsuhiko, @myriadicity, Robin Friedrich, Robert Kahn, @paulweveritt, @pwang, Sjoerd Mullender, @stevenpemberton, @timoreilly, @teoliphant, @tonroosendaal


У оригінальному твіті перелічено багато людей, причому судячи по нявності там Armin Ronacher (mitsuhiko) - фільм стосується не лише core-python розробників. Ну щож, треба буде подивитись (шкода що у кінотеатрах не покажуть 😁).

https://fxtwitter.com/gvanrossum/status/1924092904932282569
🔥32😁1🤡1
Внутрішні інструменти Google та їх альтернативи
В Google є величезна кількість внутрішних технологій та інструментів. Й є чудовий репозиторій з альтернативними інструментами та технологіями для/від колишніх гуглерів. Не для всього є альтернативи, але можна побачити різноманіття того, що застосовується всередені Google. Якщо цікаво ознайомитися, то ось лінк - https://github.com/jhuangtw/xg2xg
👍7🤔1👀1
Штука котра вартувала мені не однієї години дебагу.
У starlette є два типи мідлварів - BaseHTTPMiddleware та Pure ASGI Middleware. Я хз навіщо аж два, тим паче що "чисту" мідлварь писати не надто складніше ніж іншу.
Але у BaseHTTPMiddleware є особливість, на яку любʼязно вказує документація:
Using BaseHTTPMiddleware will prevent changes to contextvars.ContextVars from propagating upwards.

Тобто якщо ви проставите значення у контекстварі усередині ендпоінта, то усередні мідлварі ви це значення вже не побачите.
Здається звʼязане це із тим що у цьому випадку starlette копіює контекст та пропагує його у ендпоінти, але так як це копія - зміни зроблені у ньому не будуть відображатись у оригіналі.
Але ок, документація вказує що Pure ASGI Middleware не має цієї особливості.
To overcome these limitations, use pure ASGI middleware, as shown below.

Тож ок, мені треба реквесто-специфічний контекст, я для цього роблю свою "чисту" мідлварь, імплементую у ній що треба і все ок, так?
А от і ні, як виявляється, BaseHTTPMiddleware (тварюка така) не лише факапить контекст для себе, а вона ще й факапить контекст навіть для "чистих" мідлварей, якщо BaseHTTPMiddleware вказана першою.

Тобто отак наша мідлварь у якій ми використовуємо contextvars буде робити

app = Starlette()
app.add_middleware(PureMiddleware) # Pure ASGI Middleware який використовує contextvars
app.add_middleware(BaseMiddleware)


А отак вже не буде

app = Starlette()
app.add_middleware(BaseMiddleware)
app.add_middleware(PureMiddleware)


І в принципі до цього можна б було і своєю головою додуматись, бо по класиці мідлварі обгортають одна одну і та що зверху може афектити нижні.
Але дока це явно не пише, і до того ж ти явно можеш і не побачити що у тебе використовується мідлварь якщо юзаєш 3rd-party інтеграції (що зі мною і сталось)
Ось наприклад https://github.com/bobbui/json-logging-python використовує чогось саме BaseHTTPMiddleware.
Коротше якщо вам у starlette (і у fastapi, і подібних фреймворках) треба мідлварь котра використовує contextvars - ставте її завжди першою, бо однієї лише наявності
Pure ASGI Middleware, як виявилось, недостатньо

У першому коменті напишу приклад, як воно працює насправді.


Лінки:
- https://www.starlette.io/middleware/#basehttpmiddleware
- https://www.starlette.io/middleware/#pure-asgi-middleware
👍84
😁9🗿52🤡1💯1
​​Обожнюю таке. Нещодавно вийшла стаття, яка розглядає вплив ChatGPT на змогу людського мозоку розвиватися. Стаття, безумовно, цікава, повна пояснень та висновків, та досить велика. А ще доволі клікбейтна, бо там може бути написано, що люди тупішають, а може навпаки, що використання ChatGPT може допомогти розвивати мозок. Короче, ніпанятна, треба читати.

І тут стає найцікавіше. Багато журналістів, блогерів та усіх таких, написали про це у своїх виданнях із подачею, що люди тупішають, бо використовують ChatGPT. Сенсація, клікбейт, хайп.

А потім виявилось, що у статтю був вбудований промт інджекшн, який казав, що для LLM треба подавати статтю однобоко, з позиції, що люди тупішають. І журналісти це зробили, бо ж клікбейт. Ну й тому що вони не читали статтю. Отупішали, короче, і журналісти і читачів трошки також.
😁18🤡3