Как в декораторе Python определить список элементов для вывода в консоль?
Структурно у меня две функции: декоратор print_inverse_matrix(inverse_matrix) для вывода в консоль результатов расчета из основной функции; inverse_matrix(matrix_origin) - получение из переданной матрицы новой матрицы, обратной переданной первоначально пользователем.
В основной функции, в ее цикле, я преобразую переданную пользователем исходную матрицу и отправляю в созданный пустой список bank_of_matrix промежуточные матрицы.
В конце концов необходимо, чтобы декоратор "увидел" этот список bank_of_matrix и распечатал его. Как это сделать?
Код (схематично):
import numpy as np
def print_inverse_matrix(inverse_matrix):
def wrapper(matrix_origin):
print('Обратная матрица:\n', '\n', inverse_matrix(np.copy(matrix)))
print('Стадии преобразования матрицы: ', '\n', bank_of_matrix)
return wrapper
@print_inverse_matrix
def inverse_matrix(matrix_origin):
"""
Функция получения обратной матрицы
"""
...
bank_of_matrix = []
# цикл преобразования:
for ...:
for ...:
...
bank_of_matrix.append(matrix)
Загвоздка в том, как вывести в консоль bank_of_matrix. Сейчас код ругается на неопределенный элемент
Ответы (3 шт):
Можно просто вернуть матрицу из функции
import numpy as np
def print_inverse_matrix(func):
def wrapper(matrix_origin):
print('Обратная матрица:\n', func(np.copy(matrix_origin)))
return wrapper
@print_inverse_matrix
def inverse_matrix(matrix_origin):
return np.linalg.inv(matrix_origin)
a = np.array([[9, 2, 3],
[4, 5, 6],
[7, 8, 9]])
inverse_matrix(a)
Обратная матрица:
[[ 0.125 -0.25 0.125 ]
[-0.25 -2.5 1.75 ]
[ 0.125 2.41666667 -1.54166667]]
Можно так:
def print_(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
# print('Стадии преобразования матрицы: ', '\n', inverse_matrix.bank_of_matrix)
print('a =', f.a)
return result
return wrapper
@print_
def f(x): # короткая функция для примера работы
f.a = [5] # в вашем случае это будет `inverse_matrix.bank_of_matrix = []`
f.a.append(2) # inverse_matrix.bank_of_matrix.append(matrix)
return x**2
f(2)
Таким образом, оба совета оказались в сочетании полезны. Вот код:
def print_inverse_matrix(func):
def wrapper(matrix_origin):
print('Обратная матрица:\n', func(np.copy(matrix_origin)))
print('Стадии преобразования матрицы: ', '\n', inverse_matrix.bank_of_matrix)
return wrapper
@print_inverse_matrix
def inverse_matrix(matrix_origin):
"""
Функция получения обратной матрицы
"""
...
inverse_matrix.bank_of_matrix = []
# цикл преобразования:
for ...:
for ...:
...
inverse_matrix.bank_of_matrix.append(matrix)