Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 21

Логирование результатов выполнения функции с использованием декоратора

11.03.2019, 23:12. Показов 7653. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго всем вечера!
Есть функция, которая что-то там вычисляет. Мне бы хотелось логировать результаты вместе с исходными данными в текстовом файле. Напрашивается использование декоратора. Но я не очень хорошо их понимаю, и есть вопросы...

К примеру, вот функция вычисления факториала и пустой декоратор:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def save_result_to_file(func):
    def wrapper(*args, **kwargs):
 
        return func(*args, **kwargs)
 
    return wrapper
 
 
@save_result_to_file
def factorial(num: int):
    value = 1
    for i in range(2, num + 1):
        value *= i
 
    return value
Первый позыв - на третьей строке посчитать значение и в блоке with сохранить в файл все, что нужно, а потом вернуть функцию... Но это как-то странно, да и вычисления задваиваются.

Подскажите, как получить и использовать вычисляемое значение еще в декораторе?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.03.2019, 23:12
Ответы с готовыми решениями:

Функции(опять передача результатов выполнения)))
Есть массив элементов. Нужно реализовать функцию удаления элемента по поиску текстового поля.... например есть такая последовательность:...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в...

5
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
12.03.2019, 03:23
Лучший ответ Сообщение было отмечено alex_filatov как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from functools import wraps
 
def logthis(fnc):
    @wraps(fnc)
    def wrapped(*args, **kwargs):
        print('log init value:', args[0])   # print or log init values before the func is executed
        res = fnc(*args, **kwargs)
        print('log result:', res)           # print or log results after the func is executed
        return res
    return wrapped
 
@logthis
def your_func(your_arg):
    return your_arg + 10
 
print('your result:', your_func(10))
1
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 21
12.03.2019, 11:27  [ТС]
Спасибо за ответ!)
Как я понял:

Цитата Сообщение от Jabbson Посмотреть сообщение
from functools import wraps
wraps просто сохраняет название функции и ее документацию, не позволяя заменить ее названием и документацией декоратора?

Цитата Сообщение от Jabbson Посмотреть сообщение
res = fnc(*args, **kwargs)
Основное здесь. Я не до конца понимаю, почему когда мы присвоили функцию в дальнейшем она "не выполняется", а только возвращает значение?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
12.03.2019, 14:16
Цитата Сообщение от alex_filatov Посмотреть сообщение
в дальнейшем она "не выполняется", а только возвращает значение?
Не вполне понял вопрос, можете переформулировать?
0
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 21
12.03.2019, 18:01  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
Не вполне понял вопрос, можете переформулировать?
Я не удачно выразился. Я имел ввиду, вы вычисляем значение находясь в декораторе (в момент присваивания res = fnc(*args, **kwargs)) и возвращаем уже готовое значение?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
12.03.2019, 18:14
Да, вместо вызова функции вызывается декоратор, а уже внутри декоратора вызывается оригинальная функция, которая выполняет вычисления.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2019, 18:14
Помогаю со студенческими работами здесь

Привести функцию возводящую число n в степень n (с использованием декоратора)
Привести функцию возводящую число n в степень n с помощью декоратора

Сохранение созданных виджетов с введенными данными, после выполнения функции add_row, Перезапись результатов
Добрый день! Помогите решить две задачи%-) 1)Сохранение созданных виджетов с введенными данными, после выполнения функции add_row...

Сохранение созданных виджетов с введенными данными, после выполнения функции add_row, Перезапись результатов
Добрый день! Помогите решить две задачи%-) 1)Сохранение созданных виджетов с введенными данными, после выполнения функции add_row...

С использованием функции для вычисления результатов напишите программу
Напишите программу, которая вычисляет среднее арифметическое значение положительных элементов массива и определяет индексы и количество...

С использованием функции для вычисления результатов напишите программу
Вычислить для числа abcd сумму чисел ab и cd, число вводится с клавиатуры


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru