Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359

Найти самый элегантный путь для логирования. Возможно с использованием паттернов

03.11.2017, 11:03. Показов 1426. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте!

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

В моем случае, логирование - это подсчет времени исполнения функции и запись этого времени и некоторого сообщения в лист. Сообщение зависит от функции. Сначала я пытался использовать класс, который в большей степени ведет себя как декоратор.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Timing(object):
    def __init__(self):
        self.spent_times = []
 
    def __call__(self, message):
        def wrap(function):
            def called(*args, **kwargs):
                time_start = timer()
                spent_time = round(timer() - time_start, 5)
                self.spent_times.append("{}={:.5f}".format(message, spent_time))
                return function(*args, **kwargs)
            return called
        return wrap
Ниже - реализация трех классов.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Boats(object):
     #... fields, init and so on
     @timing('Adding new boat')
     def add_new_boat():
         # ... some stuff
     return result
 
     @timing('Painting a boat')
     def paint_boat():
        # ... some stuff
     return result
 
     @timing('Very big function')
     def some_big_function():
        # ... this function calls many others functions which are wrapped with @timing 
        self.add_new_bot()
        self.paint_bot()
        # ....
 
     return result
Далее - второй класс:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Cars(object):
   #... fields, init and so on
   @timing('Tuning new velocity')
   def change_velocity():
      # ... some stuff
   return result
 
   @timing('Blocking_engine')
   def block_engine():
       # ... some stuff
   return result
 
   @timing('Very big function')
   def some_big_function():
        # ... this function calls many others functions which are wrapped with @timing 
        self.block_engine()
        self.change_velocity()
        # ....
 
   return result
и, третий класс:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class PriceGenerator(object):
   #... no fields, no init, no self
   @staticmethod
   @timing('Evaluation price')
   def evalute_price():
       # ... some stuff
   return result
 
   @staticmethod
   @timing('Setting price automatically')
   def change_price_automatically():
       # ... some stuff
   return result
Here only some basic structure is shown, just to clarify general idea of Timing. As you can see in Timing I have list, which will be filled with time. The problem is, when I execute modules with all of these three classes competition between all of them occurs and they pull and write to list spent_times mixed information.

Я показал костяк, чтобы была понятно общая идея класса-обертки Timing. Как Вы видите в этом классе есть лист, который со временем будет заполняться временами. Проблема в том, что когда я запускаю модули с этими тремя классами, они начинают конкурировать между собой, дергая лист spent_times и записывая туда смешанную информацию о работе функций в трех классах.

Я не могу найти четкого и солидного пути для организации логирования. Я думал о том, чтобы создать три глобальных листа:

spent_times_cars;
spent_times_boats;
spent_times_price_generator.

И после запуска функции:
Bash
1
some_big_function
, которая аккумулирует в себе все данные для логинга в
Bash
1
spent_times
, я хотел очищать этот лист. Но как тогда мне определить, какой из трех листов нужно очистить в том случае, когда должна происходить работа с классом со статическими методами?

Я думаю, что есть какое-то элегантное решение, которое задействует какой-то паттерн проектирования. А может мне вместо класса Timing нужно что-то другое, но что?

Буду признателен за любую помощь.

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2017, 11:03
Ответы с готовыми решениями:

Друзья посоветуйте самый удобный путь создания приложений с использованием API и ООП
Друзья, посоветуйте самый удобный путь создания приложений с использованием API и ООП. У самого API в чистом виде отсутствует поддержка...

Найти самый дорогой путь
Буратино бежит по полю в Стране дураков и срывает с выросших из его монеток деревьев деньги. За ним гонится Карабас-Барабас, так что...

Лабиринт, найти самый короткий путь
Лабиринт задан квадратной матрицей случайных чисел. Непроходимые клетки - 1, проходимые - 0. Начальное положение путника на нулевой строке,...

5
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.11.2017, 15:51
А чем мешают статические методы? Не поддаются логированию или декорированию?
0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
04.11.2017, 09:32  [ТС]
Вы имеете ввиду, создать внутри каждого из трех классов объект Timing?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
04.11.2017, 09:35
Я пытаюсь понять вашу проблему и начал с осмысливания этой фразы:
Цитата Сообщение от Zigfrid Посмотреть сообщение
Но как тогда мне определить, какой из трех листов нужно очистить в том случае, когда должна происходить работа с классом со статическими методами?
Тут явно подразумевается, что статические методы несут с собой какую-то проблему, нет?
0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
04.11.2017, 13:50  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Тут явно подразумевается, что статические методы несут с собой какую-то проблему, нет?
Конечно. Смотрите, вот можно создать по объекту Timing в каждом из двух первых классов, потом spent_times каждого будет доступен через объект созданного класса (Boats или Cars соответственно) и получить лист можно будет так:

Python
1
2
boats_object.timing.spent_times
cars_object.timing.spent_times
А как получить spent_time в случае, если объект для PriceGenerator не создается?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
04.11.2017, 14:49
Да вроде точно также, только у самого класса, а не экземпляра. В чём проблема? Вроде, со статическими методами и атрибутами вы работать умеете.
Создаваться он только будет единожды, при старте программы (точнее - при загрузке модуля). Типа, синглтон.

Я также не вижу, если такое поведение по каким-то причинам не устраивает - то почему бы не создать экземпляр.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2017, 14:49
Помогаю со студенческими работами здесь

Найти самый кратчайший путь в массиве
У меня есть динамический массив в котором количество строк задаётся при выполнении программы, а количество строк неизменно и равно 3. Мне...

Найти самый длинный простой путь в графе
Как найти самый длинный простой путь в графе, граф сами задаем любой . Кто может помочь с задачкой ?Я все сайты облазила ,толкового не...

Найти самый кратчайший путь к вершине графа
V=(1,2,3,4) O=(1,3),(1,2),(2,4),(3,2),(3,4),(4,3) Нужен код питон

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

Необходимо найти самый дешевый и самый дорогой рынок для покупателя
Известны названия пяти рынков города. На каждом торгуют товарами: "ручка", "книжка", "обувь", "тетрадь"....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru