Для студентов МГТУ им. Н.Э.Баумана по предмету ИнформатикаДекораторы. Фабрика декораторовДекораторы. Фабрика декораторов
2025-01-192025-01-19СтудИзба
Задача: Декораторы. Фабрика декораторов
Описание
В этом задании требуется написать фабрику декораторов, которые будут логировать вызовы функций. Чтобы не усложнять, в качестве журнала событий будем использовать списки. Требования к фабрике:
'name': 'test_function',
'arguments': {'a': 1, 'b': 2},
'call_time': datetime.datetime(2021, 8, 1, 18, 18, 7, 849184),
'result': 127
}
Ниже приведен пример использования такого декоратора.
@logging_decorator(logger) # в аргументы фабрики декораторов подается логгер
def test_simple(a, b=2):
return 127
test_simple(1) # при вызове функции в список logger должен добавиться словарь с
# информацией о вызове функции
print(logger)
[{'name': 'test_simple', 'arguments': {'a': 1, 'b': 2}, 'call_time': datetime.datetime(2021, 8, 1, 18, 18, 7, 849184), 'result': 127}]
- фабрика должна называться
logging_decorator
- при создании декоратора фабрика должна принять требуемый список-логгер в аргументах
- обернутая функция должна возвращать тот же результат, который бы вернула оборачиваемая функция
- при вызове обернутой функции в список-логгер должен добавляться словарь, в котором будут храниться название функции, список поданных аргументов, время вызова функции и результат, который она вернула. Формат словаря должен быть таким:
'name': 'test_function',
'arguments': {'a': 1, 'b': 2},
'call_time': datetime.datetime(2021, 8, 1, 18, 18, 7, 849184),
'result': 127
}
Ниже приведен пример использования такого декоратора.
Пример использования декоратора
logger = [] # этот словарь будет хранить наш "лог"@logging_decorator(logger) # в аргументы фабрики декораторов подается логгер
def test_simple(a, b=2):
return 127
test_simple(1) # при вызове функции в список logger должен добавиться словарь с
# информацией о вызове функции
print(logger)
[{'name': 'test_simple', 'arguments': {'a': 1, 'b': 2}, 'call_time': datetime.datetime(2021, 8, 1, 18, 18, 7, 849184), 'result': 127}]
Примечания
Для удобного получения переданных в функцию аргументов при ее вызове можно использовать функциюgetcallargs
из модуля inspect
. Но стоит учесть, что она так или иначе выполняет вызов исследуемой функции, поэтому такой способ плох, если функция изменяет какие-то глобальные состояния. В тестах к этому заданию таких функций нет, поэтому можно попрактиковаться в использовании модуля inspect
.Характеристики решённой задачи
Предмет
Учебное заведение
Учебная пора
Программы
Просмотров
1
Качество
Идеальное компьютерное
Размер
587 b
Список файлов
7.2 Pro.txt

Vladelo