计算插件依赖关系

2023-12-31

我需要创建一个具有依赖项支持的插件系统,但我不确定解决依赖项的最佳方法。这些插件都将从基类派生出来,每个都有自己的execute()方法。在每个插件类中,我计划创建一个dependencies属性作为它所依赖的所有其他插件的列表。

加载插件时,我将导入所有插件并将它们放入列表中,并根据依赖关系对它们进行排序。一旦它们都处于正确的顺序(因此具有依赖项的任何内容都在其所述依赖项之后的列表中),我将循环执行每个方法的列表execute() method.

我一直感到模糊的是排序背后的逻辑。我可以开始按字母顺序排列它们,直到遇到具有依赖项的依赖项 - 如果它的依赖项不在列表中,请将其放入 tmp 列表中。在第一轮导入结束时,从临时列表的末尾开始(除了具有依赖项的插件之外什么都没有的列表)并再次检查“运行列表”。如果我在“运行列表”中找到它的依赖项,请确保它的索引号高于其最高依赖项。如果它的依赖项不在列表中,请暂停它并移至临时列表中的下一个插件。一旦我到达 tmp 列表的末尾,就从顶部开始并重试。一旦所有插件都排序完毕,或者 tmp 列表在循环遍历后没有改变大小 - 开始执行插件。

临时列表中剩下的插件要么没有找到依赖项,要么具有循环依赖项。 (tmp列表中的2个插件相互依赖)

如果您仍在阅读并且能够遵循我的逻辑;这是一个合理的计划吗?有没有更简单的方法?如果我想实现执行顺序的序列号,是否有一种“简单”的方法来同时具有序列和依赖关系? (如果存在冲突,依赖项会击败排序)或者插件应该使用序列或依赖项? (首先运行带有序列号的插件,而不是带有依赖项的插件?)

TL;DR

您将如何编写插件系统中计算依赖关系的逻辑?


Edit:

好吧-我想我从维基百科页面实现了拓扑排序;下面是 DFS 的逻辑示例。这似乎有效,但我以前从未做过这样的事情。

http://en.wikipedia.org/wiki/Topological_sorting#Examples http://en.wikipedia.org/wiki/Topological_sorting#Examples

data = {
    '10' :  ['11', '3'],
    '3'  :  [],
    '5'  :  [],
    '7'  :  [],
    '11' :  ['7', '5'],
    '9'  :  ['8', '11'],
    '2'  :  ['11'],
    '8'  :  ['7', '3']
}

L = []
visited = []

def nodeps(data):
    S = []
    for each in data.keys():
        if not len(data[each]):
            S.append(each)
    return S

def dependson(node):
    r = []
    for each in data.keys():
        for n in data[each]:
            if n == node:
                r.append(each)
    return r

def visit(node):
    if not node in visited:
        visited.append(node)
        for m in dependson(node):
            visit(m)
        L.append(node)

for node in nodeps(data):
    visit(node)

print L[::-1]

您描述的算法听起来好像可以工作,但很难检测循环依赖关系。

您正在寻找的是拓扑排序 http://en.wikipedia.org/wiki/Topological_sorting你的依赖。如果您创建一个依赖关系图,其中从 A 到 B 的边意味着 A 依赖于 B,那么您可以执行以下操作:深度优先搜索 http://en.wikipedia.org/wiki/Depth-first_search以确定正确的顺序。你会想做一个常规 DFS 的变体 http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm它可以检测循环,以便您可以在这种情况下打印错误。

如果您在每个顶点上使用有序列表来存储图中的连接,则可以使用它们的序列号添加依赖项。使用 DFS 的一个优点是,当它与依赖顺序不冲突时,生成的排序列表应该遵循您的序列顺序。 (我相信;我需要测试一下。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算插件依赖关系 的相关文章

  • 管理 Tweepy API 搜索

    如果这是对之前在其他地方回答过的问题的粗略重复 请原谅我 但我不知道如何使用 tweepy API 搜索功能 是否有任何有关如何使用搜索推文的文档api search 功能 有什么方法可以控制返回的推文数量 结果类型等功能 由于某种原因 结
  • 合并数据框中的值以写入 Excel

    我有一个看起来像的数据框 column1 column2 column3 colum4 column5 1 r n 1 r s 1 r n 2 r s 3 r n 3 2 r n 1 r s 1 r n 4 r s 4 r n 5 3 r
  • sphinx 中的分组方法文档字符串

    是否可以使用 sphinx 的 autodoc 功能将多个方法文档字符串分组 以便将它们列在一起 class Test object def a self A method of group foo def b self A method
  • 是否可以在 Sphinx 中隐藏 Python 函数参数?

    假设我有以下函数 该函数记录在Numpydoc 风格 https github com numpy numpy blob master doc HOWTO DOCUMENT rst txt 并且文档是自动生成的Sphinx http sph
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • 在Python中迭代文件对象不起作用,但readlines()可以,但效率低下

    在下面的代码中 如果我使用 for line in fin 它只对 a 执行 但如果我使用 wordlist fin readlines for line in wordlist 然后它执行 a thru z But readlines 立
  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • Highcharts 奇怪的分组行为

    我正在使用延迟加载 http www highcharts com stock demo lazy loading加载 OHLC 数据的方法 在服务器端 我使用 Python MySQL 并有 4 个包含 OHLC 数据的表 时间间隔为 5
  • 获取 HTML 代码的结构

    我正在使用 BeautifulSoup4 我很好奇是否有一个函数可以返回 HTML 代码的结构 有序标签 这是一个例子 h1 Simple example h1 p This is a simple example of html page
  • Microsoft Azure 数据仓库和 SqlAlchemy

    我正在尝试使用 python 的 sqlalchemy 库连接到 microsoft azure 数据仓库 并收到以下错误 pyodbc Error HY000 HY000 Microsoft ODBC SQL Server Driver
  • 将 for 循环替换为 pyspark 中的并行进程

    我在脚本中使用 for 循环来为 size DF 数据帧 的每个元素调用函数 但这需要很多时间 我尝试通过地图删除 for 循环 但没有得到任何输出 size DF 是我从表中获取的大约 300 个元素的列表 用于 import call
  • Diamond-Square 算法的平滑问题

    我正在使用菱形方形算法来生成随机地形 它工作得很好 除了我让这些大圆锥形状要么伸出或伸入地形 问题似乎在于 时不时会有一个点被设置得太高或太低 Here is a picture of the problem And it can be b
  • 当我打印“查询”时获取 PY_VAR1

    我正在制作一个简单的网络抓取代码 当我尝试打印一个值时 它给了我其他东西 def PeopleSearch query SearchTerm query what is query print str query SearchTerm St
  • 如何将列表中的每个项目转换为字符串,以便连接它们? [复制]

    这个问题在这里已经有答案了 我需要加入一个项目列表 列表中的许多项目都是从函数返回的整数值 IE myList append munfunc 我应该如何将返回的结果转换为字符串以便将其加入列表 我是否需要对每个整数值执行以下操作 myLis
  • django 中的“管理器”是什么?

    我已经阅读了Django官方中的定义文档 https docs djangoproject com en dev topics db managers 我仍然对什么感到困惑Manager does 文档说它们允许您操作数据库表 模型 但我仍
  • Python:使用for循环更改变量后缀

    我知道这个问题被问了很多 但到目前为止我无法使用 理解答案 我想改变for循环中变量的后缀 我尝试了 stackoverflow 搜索提供的所有答案 但很难理解提问者经常提出的具体代码 因此 为了清楚起见 我使用一个简单的示例 这并不意味着
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 无法在 Windows 服务器上使 SVN 预提交脚本失败

    我正在编写一个 SVN pre commit bat 文件 该文件调用 Python 脚本来查询我们的问题跟踪系统 以确定用户提供的问题跟踪 ID 是否处于正确的状态 例如 打开 状态 并与正确的关联项目 SVN 服务器运行 Windows
  • 使用Python的线程模块调用ctypes函数比使用多处理更快?

    我一生都无法找出这个问题的答案 我编写了一个可以执行数百次繁重计算的脚本 我有一个绝妙的主意 将这些计算任务编写为 C 然后使用 Python 的 ctypes 与它们交互 我心想 我什至可以使用并行性进一步优化它 我最初的方法是使用线程

随机推荐