yapsy没有正确加载插件

2 投票
1 回答
745 浏览
提问于 2025-04-16 23:08

我在做一个Python应用时使用了yapsy这个工具。

我为我的应用写了一个新的插件,并把它放在了和其他插件一样的文件夹里。

我的所有插件都是从一个叫做doctype的插件类继承的,这个类在general.interfaces里,而doctype类又是从IPlugin类继承的。

所有插件都能正常加载,但对于这个新插件,我看到的是:

< general.interfaces.DocType object at 0x......>

而不是

< PDF object at 0x.......>

我觉得yapsy好像加载了所有插件继承的主插件类,而这个主插件类又继承自IPlugin。

我的应用在所有插件上都运行得很好,除了这个新插件。我检查了代码,发现没有任何不同的地方,一切看起来都没问题。

1 个回答

1

我是yapsy的主要开发者,刚看到这个消息...

不过我猜你在四个月后可能已经去做别的事情了,但无论如何。

我想先提一下,如果你能在yapsy的跟踪器上提交一个bug报告,那会是最好的,地址是:

https://sourceforge.net/tracker/?group_id=208383

如果你决定这么做,能附上一些代码片段对我帮助会很大。

根据你在这里给出的简单描述,我很难判断问题出在哪里,但至少看起来“设置”可以通过对yapsy的一些单元测试做小改动来重现。

如果我非要猜测一下,问题可能出在使用Python的'issubclass'来识别不同类别的插件上,这个方法有点粗糙。因为“类别”是相对于一个父类来定义的,所有同一类别的插件都必须从这个父类继承(更准确地说是“从...继承的类的实例”)。

如果你用类似下面的方式定义类别映射,就会造成混淆:

{
"GeneralDocCategory": general.interfaces.DocType,
"PDFcategory": general.interfaces.PDFDocType
}

在这里,PDFDocType是从DocType继承的。问题的根源在于同时存在母类和它的一个子类来定义两个不同的类别。

解决这个问题的方法可以是:

方案A:以更聪明的方式重新设计yapsy(由于时间非常紧张,这个方案在yapsy的主仓库中不会很快实现,但你可以随意分叉、贡献或修改任何东西)

方案B:为“非特定”的文档类型定义一个“特定”的类(这可不是开玩笑),以便通过类似下面的方式定义类别:

{
"UnkownDocCategory": general.interfaces.UnknownDocType,
"PDFcategory": general.interfaces.PDFDocType
}

在这里,UnknownDocType和PDFDocType都会继承DocType。

撰写回答