Uraduga插件系统

puradouga的Python项目详细描述


Puradouga

概述

Puradouga是Uraduga的插件系统。目前它的唯一任务是充当uradouga和metadouga之间的接口。但只要遵循相应的指导原则,它也可以与其他项目无问题地进行交互。 Puradouga包含一个通用插件系统,该系统在puradouga.core中定义。基于此,puradouga.plugins.media包含几个类,这些类作为单个插件的基础。此外,puradouga.plugins.data包含各种数据类,它们充当插件的参数和结果。各个接口显式地指定这些数据类型之一或使用python数据类型。

用法

插件

puradouga使用插件的动态加载,所以如果插件位于某个文件夹中,就足够了。此文件夹由Uraduga提供。

puradouga最初搜索其接口的实现。要找到它们,它们必须通过import <pluginName>可用。 这可以通过将插件设计为一个可以找到实现的文件来实现。或者,插件可以是一个包,其中的实现被导入到uuinit_uuuu.py文件中。

请注意,puradouga必须首先正常执行插件才能加载它们。因此,建议不要在文件中直接包含任何代码,而是所有代码都只能通过类访问。

创建插件的过程相对简单。首先你必须找到一个合适的接口。然后基于它编写自己的类,这将显示所需的行为。

frompuradouga.plugins.mediaimportTvMetaProviderfrompuradouga.pluginsimportdataaspmclassHelloWorld(TvMetaProvider):defseries_from_filename(self,filename_parsed:pm.FilenameParsed)->pm.SeriesResponse:returnpm.SeriesResponse(title=pm.Title(english="Hello World"))

在上面的例子中,分析了一个系列。该方法获取一个对象作为参数,其中包含有关该文件的不同信息。现在我们创建一个答案并将标题设置为Hello World。如果uradouga调用这个插件,这个系列的标题都是Hello World

装载机

加载插件主要采用puradouga内核。第一步是创建一个插件系统。它管理各个插件并提供加载插件的方法。在一个项目中使用一个pluginsystem通常就足够了,但是可以同时使用多个pluginsystem。 接下来,插件的基类和插件所在的文件夹必须在这个系统上注册。系统重新加载后,即可使用。

frompuradouga.coreimportPluginSystemfrompuradouga.plugins.mediaimportTvMetaProvidersystem=PluginSystem(auto_reload=False)system.register_source("./plugins")# Plugin foldersystem.register_base_class(TvMetaProvider)# Plugin base classsystem.reload()

下一步是创建一个过滤器。这将只返回那些对应于某个基类的plgin。其他的都将被忽略。 结果是可以执行不同的方法。这些对应于执行插件的不同策略。根据方法的不同,您可以缩短时间,因为并不是所有的插件都必须执行。

frompuradouga.coreimportPluginSystemfromtest_puradouga.test_plugin_specimportMathPluginplugin_system=PluginSystem(auto_reload=False)plugin_system.register_source("./plugins")plugin_system.register_base_class(MathPlugin)plugin_system.reload()math_filter=plugin_system.get_filter(MathPlugin)# Execute all plugins and return ordered by scoremath_filter.eval_score(MathPlugin.operation,args=[27,13])# Execute all plugins one after another, until the code exitsresults=list(math_filter.eval_ordered(MathPlugin.operation,lambdaa:a,max_results=3,plugin_name_order=['Multiply','Divide','Subtract','Add'],args=[7,5]))

由于eval方法都使用yield,因此在第二个示例中,代码可以在每个项之后中止,而不必执行所有插件。在第一个例子中这是不可能的,因为这是排序的。所有插件必须已经过评估。 Puradouga将过滤不正确的答案,只要它不在调试模式。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
socketJava UDP连接   java deeplearning4j为CNN培训创建数据仓库   java启动另一个jar并向其提供输入   java将FileChooseParams中的mime类型转换为正确的格式,以用于Intent。集合类型   java Android MediaPlayer:同时流式处理和写入文件。   java如何在Spring云数据流中注册应用程序?   类中的java静态字段初始化序列   java如何在socket中进行变量替换。发送函数   java在向ZooKeeper添加带空格的字符串时的奇怪行为   java中的derby注册表单   java如果我有一个可运行线程和一个实现线程,如何使用wait()和notify()?   java在安卓中以y轴旋转imageview中的立方体   工作进程响应rabbitmq消息的java长时间运行进程   java Ehcache与数据库不同步   java加载JNI Dll   java如何在一个arraylist中对两个不同的模型进行排序?