Мобильное приложение на Kivy и Python? Мм… Не сейчас

Есть несколько GUI‑фреймворков на Python. Большинство из них предназначены только для десктопных приложений. Kivy — редкое исключение: с использованием этого фреймворка можно, в теории, строить мобильные приложения. К сожалению, он не готов к продакшену. Вы вынуждены жонглировать версиями библиотек, чтобы заставить это работать. Так что, даже сидя в футболке с надписью print("Python is my favorite language"), я должен признать, что Kivy не подходит для мобильной разработки. Хорошо. Жонглировать версиями приходится и в случае веб‑приложения. Но всё‑таки тогда в 99 % случаев речь идёт о библиотеках Python либо есть контроль над окружением. В целом вы можете построить Docker‑образ с любыми версиями, какие необходимы. Kivy же вносит кучу бинарных зависимостей, которые должны быть установлены с помощью специфичных для платформ инструментов. И в целом вы не сможете контролировать окружение — а это меняет всё. ...

25 октября 2018 г.

Использовать Optional в абстрактных классах или нет?

Подсказки типов в Python необязательны: вы вольны выбирать, пользоваться ими или нет. Но, начав включать их в свой код, вы точно столкнётесь с определёнными трудностями аннотирования функций или переменных. Эта статья — моя точка зрения на один специфический случай. К примеру, имеется иерархия классов, которая выглядит похожей на ту, что представлена в коде ниже. Это может быть какой‑то маппинг в базу или иерархия команд. Самая важная часть в этом примере — то, что имеется один абстрактный класс и несколько реальных классов, его наследников. Не так важно, помечен ли этот абстрактный класс специальным образом или нет. Я просто предполагаю, что он используется в качестве такового. ...

6 сентября 2018 г.

Coders Strike Back Post-mortem

За последние несколько месяцев я потратил порядка 40 часов в выходные и по вечерам на то, чтобы написать бота, способного пройти трассу Coders Strike Back быстрее соперников. За эти 40 часов я умудрился набить порядочное количество шишек, выбраться в легендарную лигу и даже занять там, на мой взгляд, пристойное место. Данный пост — post mortem этого проекта. Важная оговорка: бо́льшая часть пути была проделана с ботами на Python, но заключительные этапы были пройдены на C++. Не думаю, что дело в Python — скорее всего, я не заметил кучу ошибок в своём коде, которые было лень исправлять, но об этом ниже. ...

12 июля 2018 г.

Computer Science Distilled

Хотите найти небольшую простую книгу о компьютерных науках? Возможно, Computer Science Distilled подойдёт. К сожалению, только в том случае, если вы не планируете программировать профессионально. В этом случае эта книга — хороший вводный курс, хороший проводник в мир компьютерных наук. Но если вы профессиональный девелопер или студент, можно смело пропускать эту книгу. It’s a short book, written in plain, basic English. It presents ideas in their simplest form. It focuses on practical aspects of computer science that matter most: everyday things that directly impact the quality of your code. ...

28 февраля 2018 г.

Tuple[Callable, Any, ...]

Подсказки с типами могут сильно помочь в работе с большим проектом на Python. Тем не менее иногда они требуют рефакторинга кода. Я писал об этом в прошлом году в этой статье, но тогда я не смог найти хорошего примера, иллюстрирующего то, что я хочу сказать. Взгляните на этот код: def process(workflow_step): func = step[0] args = step[1:] return func(*args) Что можно понять о типах из этого кусочка? То, что workflow_step — это последовательность, первый элемент которой — Callable object, а остальные элементы, если таковые имеются, — аргументы для этого вызываемого объекта. Предположим, что workflow_step — Tuple. Проблема в том, что тип (Tuple) -> Any для этой функции слишком общий и неинформативный. Можем ли мы вызвать её с пустым кортежем? Пройдёт ли (1, 2, 3)? ...

29 января 2018 г.

Как внедрить mypy в проекте на Python 2.7

Я многократно писал, что описание типов в Python помогает в работе с большими и средними проектами. При этом, если внедрять типы, то нужно регулярно делать статический анализ — причём в CI. А вот это уже не так‑то просто внедрить. Эта статья — мой рассказ о том, какие трудности придётся преодолеть в процессе внедрения. За то время, что я пытаюсь внедрить проверку типов в нашем проекте, я выработал несколько подходов к тому, как это можно сделать максимально быстро и безболезненно. На то, чтобы прийти к этому, я убил не один день. Пользуйтесь моим опытом. ...

11 декабря 2017 г.

Что почитать о asyncio. 9 полезных ссылок

Asyncio — полезная библиотека. Но разобраться с ней не так‑то просто. Документации по большей части недостаточно. Хочется примеров. Хочется подробных объяснений. Последние несколько выходных я потратил на эксперименты с этой библиотекой. Во время чего в Pocket осели довольно интересные ссылки, которыми я хочу поделиться. Exploring Python 3’s Asyncio by Example Короткое введение в asyncio и aiohttp на нескольких небольших примерах. Примеры сделаны максимально простыми. Используется синтаксис с декораторами — статья написана довольно давно. Как отмечает автор, эта статья показывает лишь верхушку айсберга. ...

20 октября 2017 г.

Поддержка целостности проекта в Python требует усилий

Python позволяет программисту довольно много. Это очень выразительный язык. Его динамическая природа даёт возможность делать элегантные решения, которые довольно сложно представить, к примеру, в Java. Тем не менее за всё надо платить. При росте кодовой базы проекты на Python начинают требовать всё больше и больше ресурсов на поддержание своей целостности. Без некоторых усилий проект начинает разваливаться на куски. Первая проблема — навигация по коду Основная проблемная часть — навигация по коду. На начальном этапе её зачастую приносят в жертву более компактному решению, что впоследствии обязательно приведёт к ряду проблем. Главная из которых — высокая сложность поиска причин ошибок. ...

6 октября 2017 г.

Хэш-функция для функции в Python

Пару недель назад один из моих коллег задал вопрос: можно ли использовать функцию в качестве ключа словаря? Да, можно. У каждой функции в Python есть хеш. Но как он считается? На основе имени функции? На основе байт‑кода? В действительности хэш считается как трансформация над указателем на объект функции. Тем не менее не так‑то легко отыскать эти расчёты в коде CPython. Навигация по C‑коду — довольно интересный опыт, хотя делать это совсем непросто: все эти макросы делают простой поиск нужных переходов довольно сложным. Конечно, я уверен, что вы сможете с этим справиться и найти все вызываемые функции при запросе хеша для объекта функции. ...

12 сентября 2017 г.

Success in Programming. Обзор Книги

Персональный бренд — тема, не так часто обсуждаемая среди программистов. В действительности я знаю всего несколько людей, обладающих сильным персональным брендом, и всего двоих, кто рассказывает о построении личного бренда программистам. Один из них — Фредерик Харпер (Frederic Harper) с его книгой «Success in Programming». Почему персональный бренд важен? OK. Вы знаете кого‑нибудь, кто бы получил работу в крупной технологической компании без прохождения ада интервью? Я знаю одного. Хедхантеры одной подобной компании умоляли его уделить им минуту — и не для того, чтобы начать долгий процесс из серии интервью. Нет. Только для того, чтобы обсудить с ним, над каким из их проектов он хотел бы работать. ...

17 августа 2017 г.