Это очень плохая идея - декорировать рекурсивный метод, подобный тому, что был в вашем примере.Для некоторых методов и декораторов это может работать, но не алгоритм сортировки.Проблема в том, что каждый рекурсивный вызов будет заканчиваться вызовом через оболочку декоратора.С вашим shuffle
декоратором это означает, что вы будете переставлять список при каждом рекурсивном вызове, поэтому ваш список никогда не сортируется.Даже если сортировка не перетасовывается при каждом вызове, у вашего timer
декоратора, вероятно, будет аналогичная проблема, так как он будет пытаться рассчитать время каждого рекурсивного вызова, а не только вызов верхнего уровня функции.
Одним из вариантов может быть разделение рекурсивного метода и декорированного метода.Часто это хороший способ спроектировать API для функции, которая в любом случае будет реализована с рекурсией, поскольку вам часто нужно будет передавать дополнительные аргументы в рекурсивные вызовы, но вызов верхнего уровня не нуждается в них.
@shuffle
@timer
def bubble_sort_recursive(self): # despite the name, this function is not recursive itself
self.bubble_sort_recursive_helper()
def bubble_sort_recursive_helper(self): # all the recursion happens in this helper method
... # recursive code goes here, recursive calls should be to the helper!