У меня есть объект obj и ряд функций
def func1(obj):
#...
def func2(obj):
#...
def func3(obj):
#...
что каждый изменяет значения атрибутов obj.
Я хочу, чтобы мой ввод был чем-то вроде
obj = MyObject()
obj.attr=22
Это должно быть передано функции closure(), которая вычисляет все возможные применения вышеперечисленных функций, что означает func1(func2(obj)), func3(func1(func1(obj))) и т.д. до определенного условия остановки (например, не более 20 композиций функций).
Вывод должен быть списком всех возможных выходов вместе со всеми ведущими там путями. Поэтому, если, скажем, 104 и 93 являются единственными возможными конечными выходами, если obj.attr=22, и есть два способа добраться до 104, а один - для 93. Тогда
print closure(obj)
должно быть что-то вроде
[22, 64, 21, 104] #first path to 104 through , func1(obj),func1(func1(obj)), func1(func1(func3(obj)))
[22, 73, 104] #second path to 104 through , func3(obj),func3(func2(obj)),
[22, 11, 93] #the only path to arrive at 94
Как я мог реализовать это? Как было предложено в комментариях, это лучше всего делать с деревьями, но, хотя я пробовал 2 дня, я почти не добился прогресса в реализации этого (я новичок в Python/programming)!
Мой пример настолько прост, что вместо func(obj) мы могли бы напрямую использовать func(22), но пример, который мне нужен для работы, более сложный, где определенно нужно будет использовать объекты, поэтому это будет лишь минимальным рабочим примером для этого.
Дерево, вероятно, не будет полным n-арным деревом, так как каждое приложение-функция будет содержать тест, может ли он применяться к текущему состоянию (атрибутов) obj, а в некоторых случаях тест не удастся оставляя (атрибуты) obj неизменными.