Мне нужно создать систему плагинов, которая будет поддерживать зависимости, и я не уверен, что лучший способ учесть зависимости. Все плагины будут производными от базового класса, каждый со своим собственным execute ()
метод. В каждом классе плагина я планировал создать атрибут dependencies
в виде списка всех других плагинов, от которых он зависит.
При загрузке плагинов я бы импортировал их все и вставил в список и отсортируйте их по зависимостям. Как только они все будут в правильном порядке (чтобы все, что связано с зависимостями, было в списке после указанных зависимостей), я бы перебирал список, выполняя каждый метод execute ()
метод.
Где I ' m продолжает становиться нечетким - это логика сортировки. Я могу просто начать размещать их в алфавитном порядке, пока не найду тот, у которого есть зависимость - если его зависимостей еще нет в списке, поместите его в список tmp. в конце первого раунда импорта начните с конца временного списка (список, в котором нет ничего, кроме плагинов, которые имеют зависимости) и снова проверьте «список выполнения». Если я нахожу его зависимости в «списке запусков», убедитесь, что у него более высокий индексный номер, чем его самая высокая зависимость. Если его зависимостей нет в списке, задержите его и перейдите к следующему плагину в временном списке. Как только я доберусь до конца списка tmp, начните с начала и попробуйте снова. После того, как все плагины отсортированы, или список tmp не изменит размер после цикла по нему - начните выполнение плагинов.
В временном списке останутся плагины, для которых либо не обнаружены зависимости , или иметь циклическую зависимость. (2 плагина в списке tmp, которые зависят друг от друга)
Если вы все еще читаете И вы можете следовать моей логике; это разумный план? Есть способ попроще? Если бы я хотел реализовать порядковые номера для порядка выполнения, есть ли «простой» способ иметь как последовательность, так и зависимости? (с зависимостями, превосходящими последовательность, если возник конфликт) Или плагин должен использовать последовательность ИЛИ зависимости? (Сначала запускайте плагины с порядковыми номерами, а не с зависимостями?)
TL; DR
Как бы вы написали логику для вычисления зависимостей в системе плагинов?
Редактировать:
Хорошо - я думаю, я реализовал топологическую сортировку со страницы википедии; следуя его логическому примеру для DFS. Кажется, это работает, но я никогда раньше не делал ничего подобного.
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]