Python adapter

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Wed 30 Dec, 2015 17:52

Не прошло и трёх лет, как у меня дошли руки набросать демо.

В аттаче пример для Python. Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.
Attachments
pygin_20170617_c7e6d83.7z
(112.16 KiB) Downloaded 8 times

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Wed 03 May, 2017 09:10

Latest post of the previous page:

Лог запуска в appverif.exe -
Far.exe.0.dat.xml
(3.39 KiB) Downloaded 5 times
. Наверное, нужны символы для pygin, чтобы нарыть больше инфы?

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Thu 04 May, 2017 00:45

Как выяснилось, у них там местами весьма своеобразное понимание того, что такое reference counting.

Баг исправлен, аттач в шапке обновлён.

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 04 May, 2017 07:55

у меня показывает "Latest post of the previous page:" первым сообщением на странице вместо шапки топика.

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Thu 04 May, 2017 10:26

DrKnS wrote: у них там местами весьма своеобразное понимание того, что такое reference counting
У меня продолжает подгорать от увиденного, поэтому напишу подробнее.

Как работает resource management в общем случае? Вы получаете от рантайма объект и однократно сигнализируете, когда он вам не нужен (malloc...free, new...delete, open...close etc.), после чего объект больше не жилец.
Как работает reference counting в общем случае?
Да примерно так же, только вы дополнительно сигнализируете, когда на этот объект начинает и прекращает ссылаться кто-то ещё. Объект в этом случае больше не жилец тогда, когда он не нужен никому.
Всё это отлично ложится на идиому RAII в C++: в конструкторе/операторе копирования увеличиваем счетчик, в деструкторе уменьшаем, после чего object lifetime становится проблемой индейцев и можно думать о более насущных вещах.

В C же, где RAII нет, полезных ископаемых нет, воды нет, растительности нет, населена роботами обо всем, увы, надо сигнализировать ручками.

Дядя Гвидо, похоже, проникся проблемой индейцев сишников и решил немного сократить им копипасту: если они хотят получить объект, которым явно владеет кто-то ещё - зачем утруждать несчастных? Дадим им объект, не увеличивая счетчик, все равно предыдущий владелец никуда же не денется, да? Зачем счетчик дёргать, да? И назовем это borrowed reference, шоп красиво было.
А некоторые функции (но не все) пусть сами уменьшают счетчик переданных им объектов, потому что ну кому те объекты потом нужны, да? И назовем это stealing a reference, шоп красиво было.

Как это выглядит с точки зрения здравого смысла?
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.

Иными словами, чтобы получить статически корректную программу, недостаточно убедиться в отсутствии голых, необернутых в smart pointerы указателей в коде - надо полностью инкапсулировать всю эту сишную авгиеву конюшню и писать обертку для каждой Py*-функции, периодически расставляя в них костыли-инкременты.
:facepalm:

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 04 May, 2017 11:58

Крутяк. =) Я начал читать, но "ниасилил" продраться сквозь текст и кучу других вкладок, требующих внимания.

Я вот не понял - можно ли в API вставить имена для параметров в функцию, из которых будет ясно, функция берёт ссылку взаймы (borrowed, счётчик не увеличен, и пока родитель висит и ждёт в стеке, функция может делать с объектом всё что угодно) или крадёт (stealing, родитель или может отстрелиться или уже отстрелился, поэтому функции надо самой думать, как избавиться от референса).

В третьем питоне дядя Гвидо не сильно старался прикладываться, но там много чего делалось для алгоритмической оптимизации производительности - замена всего и вся на непонятные для простых смертных генераторы, и т.п. Возможно это необходимо для поддержки таких вот конструкций. Ты не хочешь запостить это в python-dev@ ? https://mail.python.org/mailman/listinfo/python-dev Я думаю многим было бы интересно прочитать ответ. Могу помочь с переводом на инглиш, если что.

Полезным эффектом будет дополнить документацию понятным объяснением зачем это нужно, в дополнение к тому, как это работает..
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.

User avatar
HaRT
Moderator
Posts: 7983
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

Python adapter

Post by HaRT » Thu 04 May, 2017 12:19

DrKnS wrote: У меня продолжает подгорать от увиденного
Не зря же Py_DECREF начинается с “Пы_ДЕЦ”.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Thu 04 May, 2017 15:41

techie wrote: можно ли в API вставить имена для параметров в функцию, из которых будет ясно
Можно, наверное. Правда, в нормальном обществе это принято просто делать разными типами, делая ошибку невозможной в принципе.
функция берёт ссылку взаймы ... или крадёт (...функции надо самой думать, как избавиться от референса).
Так думать вообще ни о чём не надо - переданный объект содержит счетчик ссылок и будет жить пока он не 0. Если он функции нужен после выхода - инкремент. Владеет ли им кто-то ещё - не её дело.

Borrowed reference экономит пару тактов процессора и одну строку в C-коде, но, учитывая, что это 1) питон и 2) апи для интеграции с другим языком, это экономия даже не на спичках, а на атомах.
Это как ехать за границу на машине и даже зная, что впереди многочасовая пробка и таможня, все равно лезть на красный, чтобы сэкономить 30 секунд.
В третьем питоне ... много чего делалось для алгоритмической оптимизации производительности
Это так аж с cамого начала.
Возможно это необходимо для поддержки таких вот конструкций.
Всё куда прозаичнее:
These functions were designed to steal a reference because of a common idiom for populating a tuple or list with newly created objects
- т. е. чтобы однострочники на сишечке проще ваять было.
Ты не хочешь запостить это в python-dev@ ?
А толку? Менять это уже 20 лет как поздно, а ответ и так известен - это C, тут так заведено.
Здесь считаем ссылки, здесь не считаем, здесь рыбу заворачивали.

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Sat 06 May, 2017 10:01


User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Python adapter

Post by Sav » Mon 08 May, 2017 09:26

techie wrote: шаблон
Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Tue 09 May, 2017 22:20

Обновил архив в шапке.
Изменения преимущественно внутренние, из видимого наружу - теперь есть динамический модуль farapi, предоставляющий плагину функции Far.

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Wed 10 May, 2017 00:33

Sav wrote:Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__
Fixed, thanks. https://github.com/techtonik/discovery/ ... 193a870cd1

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 05:21

Ещё было бы удобно для сортировки версий поменять имена архивов с pygin_89f1868_090517.7z на pygin_170509_89f1868.7z

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 05:32

А что за магия такая - `import __hello__` - это питоновский код или С?

И вот это вот весьма странно:

Code: Select all

def GetGlobalInfoW(info):
	global Plugin
	Plugin = hello_world_plugin(info)
Лучше, если плагин объявит класс `hello_world_plugin(farapi.Plugin)`, и Far автоматом его пнёт после импорта плагина. Типа высокоуровневый API. https://stackoverflow.com/questions/588 ... m-this-one

User avatar
techie
Posts: 733
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 23 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 05:41

DrKnS wrote: Обновил архив в шапке.
Изменения преимущественно внутренние, из видимого наружу - теперь есть динамический модуль farapi, предоставляющий плагину функции Far.
Что-то не видно его.

Code: Select all

    import farapi
NameError: name 'farapi' is not defined

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Thu 11 May, 2017 07:39

techie wrote: А что за магия такая - `import __hello__` - это питоновский код или С?
Это такой встроенный хелловорлд.
Лучше, если плагин объявит класс `hello_world_plugin(farapi.Plugin)`, и Far автоматом его пнёт после импорта плагина. Типа высокоуровневый API.
Я думал об этом, но кто этот высокоуровневый API потом будет документировать?
А так оно более-менее похоже на то, что на api.farmanager.com.
Что-то не видно его.
Написано же - динамический. Он не импортируется, а приходит в SetStartupInfoW.

Smitis
Posts: 1440
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 22 times
Contact:

Python adapter

Post by Smitis » Thu 11 May, 2017 07:45

В новой версии поломался вывод на экран из плагина helloworld. Или это так задумано?
Разум когда-нибудь победит.

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Python adapter

Post by DrKnS » Thu 11 May, 2017 07:49

Smitis, текущая стадия разработки не предполагает наличия обратной совместимости. Вывод на экран переделан, helloworld, идущий в комплекте, должен работать.

Post Reply

Return to “Разработка плагинов”

Who is online

Users browsing this forum: No registered users and 2 guests