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

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

11.03.2019, 23:12. Показов 7603. Ответов 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
5906 / 3358 / 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
5906 / 3358 / 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru