Использовать 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 г.

Структуры данных и алгоритмы в Java (2-е издание)

Для меня основное достоинство книги «Структуры данных и алгоритмы в Java» — язык, которым автор описывает алгоритмы. Он не использует сложный академический язык, приправленный тонной высшей математики. Роберт Лафоре использует простой язык и пытается дать максимально простое объяснение, какое только возможно, каждому алгоритму. Почему эта книга? Эта книга — для занятых (или ленивых) студентов или программистов, которые решили повторить алгоритмы перед техническим интервью. Книгу можно просмотреть очень быстро: читаем список идей после каждой статьи, просматриваем примеры кода. Если что‑то показалось непонятным, возвращаемся к основному тексту главы. ...

15 августа 2017 г.

Горячие клавиши Emacs в русской раскладке

Думаю, вы, как и я, не можете позволить себе пользоваться только английской раскладкой клавиатуры. Так или иначе для работы приходится использовать обе: и русскую, и английскую. В целом это не доставляет никаких проблем, пока дело не касается Emacs. Не знаю почему, но в нём горячие клавиши в русской раскладке просто перестают работать. Видимо, сказывается страшное наследие «ASCII — единственно возможный набор символов для всех языков мира». Возможно, есть какие‑то другие причины. ...

10 июня 2017 г.