Pygin — Python adapter

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

Pygin — Python adapter

Post by DrKnS »

Image

Не прошло и трёх лет, как у меня дошли руки набросать демо для Python.
Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

Latest post of the previous page:

techie wrote: в __init__ ему ничего не валится
Помедитировал, теперь валится.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

techie wrote: clipboard.png
Помедитировал ещё, теперь будут стандартные сообщения.
Far надо >= 4959.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Теперь две ошибки выдаётся для 04class. Первая, что `AttributeError: module '04class' has no attribute 'FarPluginClass'`, а вторая

Code: Select all

                              Error loading plugin
                 C:\Far Manager\Plugins\04class\__init__.py
               The data area passed to a system call is too small.
Вот вторая ошибка вообще непонятна. Ожидается что-нибудь типа такого.

Code: Select all

                              Error loading plugin
                                   Plugins\04class\__init__.py
                    Module '04class' doesn't define 'FarPluginClass'.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Code: Select all

FarPluginClass = HelloWorldPlugin

Здесь на самом деле не создаётся объекта. Поэтому все изменения здесь будут во всех созданных объектах отражатся, пока объект их не перекроет. иметь больше одного объекта типа плагин в одном файле смысла нет, поэтому вроде ничего плохого.

Code: Select all

class HelloWorldPlugin(object):
	Title = "Hello Python world"
(object) не нужон. Title в верхнем регистре в питоне не принято, но здесь это приеольно выглядит для отделения требований API Far от остального кода.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Code: Select all

╔═ Pygin: std::exception ═╗
║ bad cast                ║
╟─────────────────────────╢
║         { OK }          ║
╚═════════════════════════╝
Это если GetPluginInfoW не сделать.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Code: Select all

import pygin
from pygin.farapi_types import *
...
	def GetPluginInfoW(self):
		info = PluginInfo()
Всё-таки лучше без лишних импортов. Это позволит легче тестить логику, которая на Far не завязана.

Code: Select all

import pygin
...
	def GetPluginInfoW(self):
		info = self.far.PluginInfo()
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Code: Select all

AttributeError: 'NoneType' object has no attribute 'PluginMenuItems'
Более понятно было бы что-нибудь типа.

Code: Select all

GetPluginInfoW did not return `PluginInfo' structure
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Code: Select all

╔═ Pygin: std::exception ═╗
║ bad cast                ║
╟─────────────────────────╢
║         { OK }          ║
╚═════════════════════════╝
Вылетает с этой вот хренью. Устал я.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

techie wrote: Здесь на самом деле не создаётся объекта. Поэтому все изменения здесь будут во всех созданных объектах отражатся, пока объект их не перекроет.
Ну да, не создается, я как бы в курсе.
Тип класса ищется по имени ("FarPluginClass", да), потом этот тип инстанцируется адаптером.
Можно было просто сразу назвать класс не HelloWorldPlugin, а FarPluginClass. Как сейчас - это типа typedef.
techie wrote:лучше без лишних импортов
Ok.
techie wrote: Вылетает с этой вот хренью. Устал я.
В архиве лежит пример, как надо делать. Делайте так же, вылетать не будет.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

DrKnS wrote: В архиве лежит пример, как надо делать. Делайте так же, вылетать не будет.
Это не питон, а шаманство какое-то. Не понимаю, в чём проблема. В том, что теперь надо обязательно использовать тип uuid из стандартной библиотеки? В питоне строгая типизация считается дурным тоном. Он хорош именно из-за duck typing.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

techie wrote: Это не питон, а шаманство какое-то.
Весьма верно подмечено, это не питон. Это интеграция питона с совсем-не-питоном.
У себя в питоне можно как угодно, но при выходе из функции питон заканчивается и duck typing заканчивается, а strong typing начинается.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Я не очень горю становиться адептом очередного карго культа.

1. Что будет с Far, если плагиновый и менюшный GUID не указаны?
2. Почему Far не чекает плагины на дублицирующиеся GUIDы, и не предупреждает/вываливается, если для него это так важно?
3. Почему Far не может генерить GUID сам по адресу плагина в памяти + номеру строки меню, возвращаемого в GetPluginInfoW?
4. Зачем GUID надо писать с минусами строкой в 36 символов? Почему нельзя использовать строку с любой длиной?
5. Зачем ограничивать символы в GUID A-F, если хочется больше уникальности?

Пока я не получил ответы на эти вопросы.
Shmuel
Posts: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

Python adapter

Post by Shmuel »

techie wrote: Я не очень горю становиться адептом очередного карго культа.
Прошло более 3 лет.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

techie, это, несомненно, прекрасные вопросы, но они уже заданы в другой теме, а здесь это полнейший оффтопик.
User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Python adapter

Post by techie »

Не знаю я почему это оффтопик здесь. В контексте питон адаптера эти гуиды как кость в горле. Я видел много binding'ов к C и С++ продуктам, много плагинов на питоне инетерфейсов для реализации. Опустим момент, что нигде для идентификации плагинов и меню не использовались гуиды. Более важно, что каждый раз подробно объяснялись особенности использования питона, и с какими архитектурными решениями это связно. Если важно сохранять ссылки, то объяснялось, кто и как их собирает. Если были дурные интерфейсы для С++, но приводился пример проблемы, которая всплывает, если их убрать.

Я не вижу смысла задавать прекрасные вопросы в общем виде в темах, кто народ не горит желанием копать и отвечать на них. Лучше решать их в контексте конкретных реализаций, и здесь они конкретно про Python адаптер. С другой целью меня эти гуиды больше не интересуют.
User avatar
DrKnS
Posts: 5743
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 319 times

Python adapter

Post by DrKnS »

techie wrote: В контексте питон адаптера эти гуиды как кость в горле.
Кому-то налоги как кость в горле.
Кому-то ПДД как кость в горле.
Кому-то соседи как кость в горле.

Однако, если вы хотите пользоваться благами цивилизации, то на это горло приходится наступать и делать так, как все.

Гуиды в фаре используются для идентификации плагинов, независимо от особенностей языка и особенностей автора.
Post Reply

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