О новом инструменте, упрощающем работу с ctypes.
В прошлом году мне в голову пришла мысль, что неплохо было бы попробовать подружить ctypes (модуль стандартной библиотеки, позволяющий взаимодействовать с функциями из Си-библиотек) с аннотациями типов.

На заметку
Поддержка аннотаций появилась ещё в начале серии 3 (PEP 3107), однако пользоваться этой машинерией стало относительно удобно, начиная с Питона 3.6.

Тогда же я накидал прототип, подтвердивший предположение, что может получиться удобно. Однако дальше прототипа дело не двинулось.

И вот в прошлом месяце, в свободные выходные я заметил, что steampak перестала работать с последними версиями библиотеки Steam.

На заметку
О том, что такое steampak можно узнать из вводной статьи, а также из видео.

Обнаружив это, я решил, что неплохо было бы восстановить работоспособность библиотеки. Только вот тратить на это много времени не хотелось. Поэтому я потратил ещё больше времени, чтобы не тратить его в последующем: накидал новую библиотеку ctyped.

Библиотека позволила не только быстро и удобно описывать Си-функции, но и немного повысить производительность steampak (за счёт сокращения количества функций-обёрток, а также отсутствия повторных привязок сигнатур). Посмотрим, как выглядит код для ctyped:

from ctyped.toolbox import Library

# Объявляем библиотеку.
# Для всех функций используем префикс mylib_.
lib = Library('mylib.so', prefix='mylib_')

# При помощи областей (scope) можем
# пакетно влиять на различные аспекты функций:
# выставлять префиксы, указывать битность целых и пр.
with lib.scope(int_bits=64):

# Описываем Си-функцию 'mylib_some_func', используя аннотации типов.
@lib.function(name='some_func')
def format_title(title: str, num: int) -> str:
...

# Осталось только привязать типы ctypes
# к описанным функциям (в нашем примере она одна).
lib.bind_types()

А теперь можно вызывать Си-функции, прямо как родные функции Питона:

formatted = format_title('Hello!', 2019)

Это, конечно, не всё, что умеет ctyped. Скажем, она предлагает возможность структурирования функций при помощи классов. Больше примеров использования можно подсмотреть в документации (англ.) и обёртке из steampak.

Сейчас ctyped требует Python 3.6+ и тестируется только с .so библиотеками (под Linux). Есть многое, чему можно было бы её обучить: например, удобной работе со структурами.
ctyped разрабатывается открыто — https://github.com/idlesign/ctyped
Заметите ошибки, или захотите что-то добавить — приходите в репозиторий по указанной выше ссылке.

Приятной интеграции.

Категории

Язык
Интерпретатор
ЯП
Проект
Аспект языка

На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.