Мне нужно создать систему плагинов, которая будет иметь поддержку зависимостей, и я не уверен, что это лучший способ учета зависимостей.Все плагины будут разделены на подклассы из базового класса, каждый со своим собственным методом execute()
.В каждом классе плагинов я планировал создать атрибут dependencies
в виде списка всех других плагинов, от которых он зависит.
При загрузке плагинов я импортировал бы все из них и поместил их вперечислить и отсортировать их на основе зависимостей.Как только все они будут в правильном порядке (поэтому все, что связано с зависимостями, находится в списке после упомянутых зависимостей), я перебираю список, выполняя каждый метод execute()
method.
Где я продолжаю получатьнечеткая логика сортировки.Я могу просто начать размещать их в алфавитном порядке, пока не наткнусь на тот, у которого есть зависимость - если его зависимости еще нет в списке, поместите его в список tmp.в конце первого раунда импорта начните с конца временного списка (список, в котором нет ничего, кроме плагинов с зависимостями) и снова проверьте «список выполнения».если я найду его зависимости в «списке выполнения», убедитесь, что у него более высокий индекс, чем у самой высокой зависимости.Если его зависимостей нет в списке, удерживайте его и перейдите к следующему плагину во временном списке.Как только я доберусь до конца списка tmp, вернитесь к началу и попробуйте снова.Как только все плагины отсортированы, или список tmp не меняет размер после зацикливания на нем - начните выполнять плагины.
Что останется во временном списке, это плагины, которые либо не имеют их 'Re зависимости найдены, или имеют круговую зависимость.(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]