Bluetooth в Mac OS из Python: комментарии к коду
Пока не забыл, что происходит в коде к предыдущей заметке, опишу для себя.
Первая строка после импортов — загрузка, собственно, самого АПИ, загружается разделяемая библиотека, находящаяся по указанному пути. Далее определяется класс-объект, наследуемый от NSObject, это специальный класс, который позволяет прикидываться объектам Пайтона объектами Обжектив-Си.
В этой связи, объекту приходится ставить специальные подпорки — посмотрите на последнюю строку, там вызывается метод new класс-объекта, для Пайтона это непривычный метод создания объектов. Необычен так же конструктор, вместо него используется метод init, внутри которого я назначаю данный объект обработчиком ассинхроных вызовов, методы которого будут вызываться во время сканирования. Внутри конструктора первая строка тоже обязательна, это так же специальная подпорка.
В методе getfounddevices я вызываю метод, запускающий сканирование, и дожидаюсь, когда один из методов (deviceInquiryDeviceFound_device_, вызывающийся на успешном скане или deviceInquiryComplete_error_aborted_, который вызывается, если произошла ошибка или ничего не найдено) установит флаг, что сканирование завершено.
Цикл ожидания (единственный while в коде) для меня опять же является магией, я лишь могу предположить, что он позволяет обрабатывать поступающие события, простой цикл со sleep не даёт никакого эффекта. Потом я возвращаю имена и адреса найденных устройств.
Декораторы objc.typedSelector указывают сигнатуру вызываемого объекта и позволяют указать как именно будут переданы параметры. До конца эта магия мне пока непонятна.
Например, «v@:@iB» расшифровывается как «void», «объект», «селектор метода», «объект», «int», «булевое». Т. е. метод ничего не возвращает, потом идут параметры: никаких идей что такое «объект-селектор метода» (но по наблюдениям, этот параметр всегда соответствует self), дальше передаётся объект, потом целое, потом значение булевского типа.
Всё что перечисленно через подчёркивание — это имена сообщений, в терминах Обжектив-Си. Например, сообщение из кода «[myRect setWidth:10.0 height:20.0]» имеет имя «setWidth:height:» и кодируется вот так: setWith_height_, то есть, двоеточие в имени сообщение заменяется на подчёркивание. Полный вызов будет выглядеть следующим образом: «myRect.setWith_height_(10.0, 20.0)».
Это, кажется, «замангленные» имена функций.
Комментарий для rigidus.livejournal.com:
Я ниже этой фразы расписываю что это. Мне эта магия понятна не до конца, а не непонятна вовсе.