cookie

Sizning foydalanuvchi tajribangizni yaxshilash uchun cookie-lardan foydalanamiz. Barchasini qabul qiling», bosing, cookie-lardan foydalanilishiga rozilik bildirishingiz talab qilinadi.

avatar

Коробка с питоном

Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация. Автор: @kiriharu

Ko'proq ko'rsatish
Reklama postlari
462
Obunachilar
Ma'lumot yo'q24 soatlar
+97 kunlar
+2130 kunlar

Ma'lumot yuklanmoqda...

Obunachilar o'sish tezligi

Ma'lumot yuklanmoqda...

Сегодня у нас простенькая задачка, а то пятница, все отдыхать хотят, я понимаю. Есть следующий код:
def test():
  try:
    return 1
  finally:
    return 2
Вопрос - что вернется при вызове test()? Все и так на этом моменте понимают, что вернётся 2 (ну не просто так же мы собрались, верно?), но почему? Ответ, как обычно, есть в документации. Возвращаемое функцией значение определяется последним выполненным return. Вторым важным аспектом является то, что finally исполняется всегда, поэтому мы и получаем его return. raise, кстати, тоже работать не будет:
def test():
  try:
    raise ValueError()
  finally:
    return 3 

test() # 3
#std #задачки
Hammasini ko'rsatish...
8. Errors and Exceptions

Until now error messages haven’t been more than mentioned, but if you have tried out the examples you have probably seen some. There are (at least) two distinguishable kinds of errors: syntax error...

🔥 9👏 5🤔 4🤯 1
Решил канал расширить ещё одной тематикой - занимательными задачками. Пока что буду писать про те, которые встречались на тех. собеседованиях. Они не всегда будут адекватные, но что уж есть :) А начнём, как полагается с классики. Надо объяснить следующее поведение:
>>> a = 256
>>> b = 256
>>> a is b
True # ???

>>> a = 257
>>> b = 257
>>> a is b
False # ???
Вопрос в том, что здесь творится с ссылками. Разберём самую первую часть. Пробуем получить id объектов:
>>> a = 256
>>> b = 256
>>> id(a), id(b)
(2214170730704, 2214170730704)
На вопрос, почему у них одинаковые идентификаторы ответит деталь реализации PyLong_FromLong (для искушенных читать можно читать отсюда), которая указывает, что интерпретатор хранит массив целочисленных объектов для всех чисел в диапазоне от -5 до 256. Поэтому, когда мы создаем переменную с числом в этом диапазоне он просто отдает ссылку на уже существующий объект. Микрооптимизация, при чём очень важная - так уж получилось что числа из этого диапазона используются чаще всего. В Java есть похожая оптимизация, там такой диапазон составляет от -128 до 127, но есть нюансы. Второй вопрос отпадает сам собой (будут разные ссылки), но что будет если мы создадим файл с следующим содержимым и запустим его:
a = 257
b = 257
print(a is b) # True
А вот это уже нюанс работы нашего REPL. Каждая написанная нами строка в нём разбирается отдельно. Но при запуске через файл Python имеет возможность применить дополнительные оптимизации для констант, так как он видит сразу весь код - в этом и различие. #std #задачки
Hammasini ko'rsatish...
Integer Objects

All integers are implemented as “long” integer objects of arbitrary size. On error, most PyLong_As* APIs return(return type)-1 which cannot be distinguished from a number. Use PyErr_Occurred() to d...

🔥 16👏 4😢 1
Да, у нас есть тесты. А толку? Супер-мега-гига экслюзивный доступ к записи моего доклада с прошедшего PiterPy. Организаторы разрешили выложить не дожидаясь следующего года. Получилось как всегда холиварно, не всё всем может понравиться, но как минимум советую присмотреться к библиотечкам и статьям/докладам из полезных ссылок. Там немного, но самое годное из того что знаю по этой теме. Куда кидать помидоры и звездочки вы знаете 🙂🙃 https://youtu.be/liECQCFGfkE
Hammasini ko'rsatish...
Николай Хитров — Да, у нас есть тесты. А толку?

— Кандидаты часто спрашивают на собеседованиях, принято ли в команде писать тесты. И ответ в духе «да, мы пишем тесты» дает некоторую надежду, что с культурой разработки в команде все хорошо. Но бывает так, что в команде пишут тесты, но их качество оставляет желать лучшего: долго, больно и чуть что, приходится много рефакторить. Почему так происходит? Может быть, тесты не нужны? Или, может, их нужно продумывать, как и основной код приложения? В докладе говорим о том: — Как жить, когда количество тестов переваливает за пару тысяч. — Как замечать «дурные запахи» в тестах и почему это важно. — Какие плагины pytest помогут в упрощении написания тестов и их поддержке. — Какие метрики можно собирать с тестов и зачем это может пригодиться. #backend #pytest

🔥 1
PSF и JetBrains запустили своё ежегодное исследование Python Developers Survey 2023. Погнали заполнять! 👇 https://survey.alchemer.com/s3/7554174/python-developers-survey-2023 Через год, когда подведут результаты, будет повод написать пост, типа такого 😅
Hammasini ko'rsatish...
Python Developers Survey 2023

The official Python Developers Survey 2023. Join and contribute to the community knowledge!

В одном чатике встретил забавный проект fakeredis, реализующий Redis-сервер на питоне, который можно использовать для тестов. Очевидно, чтобы не таскать для тестов настоящий Redis. Поддерживаются практически все стандартные команды, которые я встречал для работы с коллекциями (список здесь). Есть не полная поддержка JSON, поиска, time series. Если каких-то команд не хватает, автор оставил гайд, как её сделать. Ну а если сделаете - законтрибутьте в опенсорс, полезное дело всё таки! #библиотека
Hammasini ko'rsatish...
GitHub - cunla/fakeredis-py: Implementation of Redis in python without having a Redis server running. Fully compatible with using redis-py.

Implementation of Redis in python without having a Redis server running. Fully compatible with using redis-py. - GitHub - cunla/fakeredis-py: Implementation of Redis in python without having a Redi...

11🔥 5
На сегодня расскажу ещё пару рецептов с more_itertools. 1) map_if работает как обычный map, но применяет функцию на элемент только если оно попадает под условие. Например, вот так мы можем возвести в квадрат только те числа, которые делятся на 2 нацело:
example = [1, 2, 3, 4, 5, 6, 7, 8]
list(map_if(example, lambda x: x % 2 == 0, lambda x: x * x)) # [1, 4, 3, 16, 5, 36, 7, 64]
2) Получить последний элемент можно при помощи last. Возникает вопрос а зачем он существует, если можно указать iterable[-1]? Ответом является то, что last позволяет указать, что ему возвращать, если элементов в итерируемом объекте нет:
last([1, 2, 3]) # Очевидно получим 3 
last([], 0) # Список пустой, но получим 0
[][-1] # Получим IndexError
Ещё есть first - как понятно из названия, он получает первый элемент. 3) map_except тоже работает как map, но умеет игнорировать ошибки. Например, мы хотим получить только те элементы, которые получилось привести к целому числу:
example = [1, "1", "2", "test", "three", object, 4.0]
list(map_except(int, example, ValueError, TypeError)) # [1, 1, 2, 4]
4) Ну и в конце про take - он просто берет N элементов из итерируемого объекта:
example = range(10)
take(3, example) # [0, 1, 2]
take(20, example) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - если больше, возьмет доступные
#itertools #more_itertools #библиотека
Hammasini ko'rsatish...
🔥 11 2🤔 2
Пока я спал, руководящий совет языка принял PEP 703 (nogil). Кратко о том, о чём говорится в посте: 1. Руководящему совету ясно, что несмотря на все проблемы и недостатки потоков, nogil будет полезен для Python, так как позволит находить более масштабируемые решения. 2. В то же время, они не уверены, получится ли убрать GIL не сломав при этом обратную совместимость - всё же не хотелось бы терять десятилетия развития базы пакетов. Существующая пакетная экосистема - это одна из сильных сторон языка, как и простая интеграция библиотек на C c CPython. 3. Оценить влияние nogil без реализации сложно, поэтому nogil должен выпускаться в составе регулярных релизов и не обязательно он там должен быть по-умолчанию. 4. Это всё ещё не гарантированная история. Если что-то пойдет не так - от изменений откажутся. Развёртывание должно быть постепенным и наиболее плавным. 5. Выкатка будет происходить в 3 фазы, которые возможно изменятся: - В первой фазе nogil сделают возможным таргетом при сборке, чтобы разработчики могли тестировать свои пакеты. - Во второй фазе, когда изменения в API и ABI будут сформированы, а поддержка nogil от сообщества будет достаточной, nogil-сборку добавлят как "поддерживаемую, но не по умолчанию". - В третьей фазе nogil-сборку сделают сборкой "по-умолчанию", а от gil-сборки будут отказываться. 6. При успешной реализации nogil, ожидается падение производительности на 10-15% в худшем случае.
Hammasini ko'rsatish...
PEP 703 (Making the Global Interpreter Lock Optional in CPython) acceptance

(Posted for the whole Steering Council.) As we’ve announced before, the Steering Council has decided to accept PEP 703 (Making the Global Interpreter Lock Optional in CPython) . We want to make it clear why, and under what expectations we’re doing so. It is clear to the Steering Council that theoretically, a no-GIL (or free-threaded) Python would be of great benefit, and the majority of the community seems in agreement. Threads have significant downsides and caveats, but they are widely adopte...

🔥 6 2🤯 2🤔 1
Недавно пришлось писать конвертор который транслировал Markdown в довольно специфичный формат. Была следующая идея - мне нужен парсер, который перегонит Markdown в синтаксическое дерево, которое я буду обходить. С обычным python-markdown в этом плане банально неудобно работать - у него нет простого и расширяемого API, который бы позволял решить мою задачу. А вот у mistletoe такое API есть. Например, вот так выглядит рендерер markdown в jira:
class JiraRenderer(BaseRenderer):

    def render_strong(self, token):
        template = '*{}*'
        return template.format(self.render_inner(token))

   def render_emphasis(self, token):
        template = '_{}_'
        return template.format(self.render_inner(token))

Ещё mistletoe можно использовать как утилиту. Например, вот так markdown-файл можно перевести в тот же формат Jira:
mistletoe foo.md --renderer mistletoe.contrib.jira_renderer.JiraRenderer

Поэтому, если вам нужна небольшая, но расширяемая библиотека для работы с markdown - берите её, не прогадаете. #библиотека
Hammasini ko'rsatish...
🔥 16👏 1
На второе октября намечен релиз Python 3.12, поэтому Никита Соболев (opensource разработчик и контрибьютор в сpython) рассказывает про новинки в новой версии и чуть затрагивает то, что ожидает нас в 3.13. Рекомендую посмотреть, чтобы оставаться в теме новых обновлений. #посмотреть
Hammasini ko'rsatish...
«Новинки в Python 3.12 и даже немного про 3.13», Никита Соболев

«Окей, Никита, что нового в Python?» Еще одни спикер #GPDays2023 Никита Соболев – Open Source разработчик и любитель Python рассказал о чистке stdlib, PEP 695, новом синтаксисе для типизации, а также uops из Python 3.13: 01:19 Что нового в новом Python 05:33 PEP 695 16:11 Байткод 19:10 Функции 22:45 Классы 27:44 Про всякое (о чем еще стоит рассказать) 36:37 Python 3.13 40:50 Выводы Все доклады секции в плейлисте

https://youtube.com/playlist?list=PLhM4a2xbfIdbjSPvJrVjKZDlbX5duEQca&si=qnc7Qe7ZXw93YGpf

🔥 4
Помните, я рассказывал про такой фреимворк как Propan? В общем, программа Propan удаляется на смену Propan пришел FastStream, и весь новый функционал будет попадать в него. Первой моей реакцией было "што" и "зачем", ведь на первый взгляд может показаться, что поменялись только орга и название. Давайте разбираться. Во-первых, за фреимворком стоит не только сам Lancetnik, а целая команда из AirtAI, что является очень сильным усилением со стороны как разработки, так и поддержки. Второе, FastKafka переходит в такой же статус как и Propan. Всё по той же причине - новый функционал будут добавлять в FastStream. В свою очередь FastStream - это фреимворк, базированный на идеях FastKafka и Propan, который хочет взять от них самое лучшее и создать единый способ для написания сервисов, работающих с очередями. Третье, что показалось мне важным, разработчик Propan признаётся, что сделать унифицированный RPC для всех брокеров (например для Kafka) - задача сложная, особенно когда брокер by design плохо рассчитан на такую функциональность. Всё сводилось к тому, что тот самый простой высокоуровневый интерфейс плохо скрывал недостатки реализации, поэтому в FastStream от него отказались. Ещё генерацию темплейтов удалили, теперь проект можно генерировать при помощи cookiecutter. А что нового уже принёс FastStream? В первую очередь, мне понравился механизм фильтров. Ещё добавили кастомную сериализацию - по умолчанию FastStream работает с Json, но если у вас Protobuf, Avro или msgpack - больше никаких проблем нет, можно добавить собственную логику для сериализации. Отдельно хотел бы выделить систему мидлварей - теперь трассировку, логи, обогащение сообщений метаинформацией делать намного проще. Очень надеюсь, что проект будет развиваться семимильными шагами, ведь идеи FastKafka и Propan мне очень сильно понравились, а сам Propan я очень часто рекомендовал знакомым. #библиотека
Hammasini ko'rsatish...
GitHub - airtai/faststream: FastStream is a powerful and easy-to-use Python library for building asynchronous services that interact with event streams.

FastStream is a powerful and easy-to-use Python library for building asynchronous services that interact with event streams. - GitHub - airtai/faststream: FastStream is a powerful and easy-to-use P...

🔥 7🤔 2🤯 1
Boshqa reja tanlang

Joriy rejangiz faqat 5 ta kanal uchun analitika imkoniyatini beradi. Ko'proq olish uchun, iltimos, boshqa reja tanlang.