У меня есть объект 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
неизменными.