Как в декораторе Python определить список элементов для вывода в консоль?

Рейтинг: 0Ответов: 3Опубликовано: 26.02.2023

Структурно у меня две функции: декоратор 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. Сейчас код ругается на неопределенный элемент

Ответы

▲ 1Принят

Можно просто вернуть матрицу из функции

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]]
▲ 1

Можно так:

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)
▲ 0

Таким образом, оба совета оказались в сочетании полезны. Вот код:

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)