Pygin — Python adapter

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

Pygin — Python adapter

Post by DrKnS »

Image

Не прошло и трёх лет, как у меня дошли руки набросать демо для Python.
Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Latest post of the previous page:

Лог запуска в appverif.exe -
Far.exe.0.dat.xml
(3.39 KiB) Downloaded 287 times
. Наверное, нужны символы для pygin, чтобы нарыть больше инфы?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

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

Баг исправлен, аттач в шапке обновлён.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

у меня показывает "Latest post of the previous page:" первым сообщением на странице вместо шапки топика.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

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: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

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

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

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

Полезным эффектом будет дополнить документацию понятным объяснением зачем это нужно, в дополнение к тому, как это работает..
А так, что время жизни объекта зависит не от его типа, а от того, какая функция вам его вернула и куда вы его потом передали.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Python adapter

Post by HaRT »

DrKnS wrote: У меня продолжает подгорать от увиденного
Не зря же Py_DECREF начинается с “Пы_ДЕЦ”.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

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: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

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

Python adapter

Post by Sav »

techie wrote: шаблон
Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

Обновил архив в шапке.
Изменения преимущественно внутренние, из видимого наружу - теперь есть динамический модуль farapi, предоставляющий плагину функции Far.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Sav wrote:Шаблон сам по себе не работает, т.к. в нем отсутствует __doc__
Fixed, thanks. https://github.com/techtonik/discovery/ ... 193a870cd1
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Ещё было бы удобно для сортировки версий поменять имена архивов с pygin_89f1868_090517.7z на pygin_170509_89f1868.7z
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

А что за магия такая - `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: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

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

Code: Select all

    import farapi
NameError: name 'farapi' is not defined
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: А что за магия такая - `import __hello__` - это питоновский код или С?
Это такой встроенный хелловорлд.
Лучше, если плагин объявит класс `hello_world_plugin(farapi.Plugin)`, и Far автоматом его пнёт после импорта плагина. Типа высокоуровневый API.
Я думал об этом, но кто этот высокоуровневый API потом будет документировать?
А так оно более-менее похоже на то, что на api.farmanager.com.
Что-то не видно его.
Написано же - динамический. Он не импортируется, а приходит в SetStartupInfoW.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Python adapter

Post by Smitis »

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

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