09.03.2019       Выпуск 272 (04.03.2019 - 10.03.2019)       Релизы

ctyped 0.6.0 — ctypes на аннотациях типов

О новом инструменте, упрощающем работу с ctypes.

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

О новом инструменте, упрощающем работу с ctypes.

В прошлом году мне в голову пришла мысль, что неплохо было бы попробовать подружить

ctypes

(модуль стандартной библиотеки, позволяющий взаимодействовать с функциями из Си-библиотек) с аннотациями типов.

На заметку

Поддержка аннотаций появилась ещё в начале серии 3 (

PEP 3107

), однако пользоваться этой машинерией стало относительно удобно, начиная с

Питона 3.6

.

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

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

steampak

перестала работать с последними версиями библиотеки Steam.

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

ещё больше

времени, чтобы не тратить его в последующем: накидал новую библиотеку

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

Заметите ошибки, или захотите что-то добавить — приходите в репозиторий по указанной выше ссылке.

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





Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus