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

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

03.11.2017, 11:03. Показов 1454. Ответов 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
03.11.2017, 15:51
А чем мешают статические методы? Не поддаются логированию или декорированию?
0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
04.11.2017, 09:32  [ТС]
Вы имеете ввиду, создать внутри каждого из трех классов объект Timing?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru