LINUX.ORG.RU

[python ] Функция с протоколированием шагов и без


0

1

Итак здравствуй ЛОР! Как решить красиво такую задачу:
есть класс,в нем методы,они должны работать в первом случае с выводом подробной информации о каждом действии, а в другом просто выполняться в режиме no comment. Пока решил задачу так:
в классе предусмотрел поле-флаг trace, а сами методы пишу так:

def testmethod(self):
  if self.trace==True:
    ...
    #делаем что-то 
   print('Сделали то-то')
    ...      
 else:
     ...
     #делаем что-то 
     ...
Но мне кажется что можно сделать как-то иначе

★★★★★
class foo:
   def debug_print(self, msg):
        if self.trace: # Не надо здесь == True!!!
            print msg

   def somemethod(self):
        do_something()
        debug_print('Сделали')
provaton ★★★★★
()

как минимум без == True, без if и без дублирования кода!

Я бы сходу предложил выделить это в mixin Traceable с методом trace, типа так:

class Traceable(object):
 def trace(*a, **kwa):
  if 'is_traced' in dir(self):
   if self.is_traced():
    print(*a, **kwa)

class MyClass(MyOtherClass, Traceable):
 is_traced = lambda: True

 def method(self):
  # делаем что-то
  self.trace('Сделали что-то')

Вот уже вместо 5 строк в методе 2.

А еще я уверен, что оно тебе не нужно, а нужна либа с нормальным логгированием или дебаггер.

t184256 ★★★★★
()
Ответ на: __debug__ от knkd

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

pylin ★★★★★
() автор топика
Ответ на: комментарий от o
assert (__debug__ == False) # если интерпретатор запущен как (python -O|python -OO)[br]
assert (__debug__ == True) # во всех остальных случаях
knkd
()
Ответ на: комментарий от knkd

assert (__debug__ == True) # во всех остальных случаях

Ну если во всех остальных, то что это за мода вообще на == True??

t184256 ★★★★★
()
Ответ на: комментарий от pylin

короче, смотри на мой или provaton'а код или в сторону смены ТЗ.

t184256 ★★★★★
()
Ответ на: комментарий от knkd

Точно а слона то я и не приметил )

pylin ★★★★★
() автор топика
Ответ на: комментарий от t184256

>>> что это за мода вообще на == True??

Для очевидности.

knkd
()

пишем ф-ю debug(text) и вызываем ее везде где нуно. Ф-я при необходимости (если поднят глобальный флаг или включен assert или еще как - вопрос Вашей фантазии) выводит text и номер строки где была вызвана (возможно со стеком) - делается лехко поскольку стек в питоне открыт.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Спасибо ,но стек не нужен будет. Это иллюстрация пошагового выполнения вычислительных алгоритмов

pylin ★★★★★
() автор топика

декоратор повесь на класс и его члены (т.е. один всего), он и будет писать когда что вызывалось. Соответственно декоратор ничего не декорирует если режит нокоментс и обёртывает собой все вызовы с выводом.

mashina ★★★★★
()
Ответ на: комментарий от pylin

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

AIv ★★★★★
()
Ответ на: комментарий от AIv

Завтра будут эксперименты в оба направления. Спасибо за идеи всем

pylin ★★★★★
() автор топика
Ответ на: комментарий от AIv

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

pylin ★★★★★
() автор топика
Ответ на: комментарий от shty

Э... вот у ТСа ф-я на 100 строк, в которой что то там считается, и по каждой второй строке хочется чирикнуть что и как. И каким местом тут декоратор поможет?

AIv ★★★★★
()
Ответ на: комментарий от shty

декоратор лучше тем, что код самой функции не замусоривается левыми вызовами, имхо так

shty ★★★★★
()
Ответ на: комментарий от AIv

Э... вот у ТСа ф-я на 100 строк, в которой что то там считается, и по каждой второй строке хочется чирикнуть что и как. И каким местом тут декоратор поможет?

как минимум, это ему поможет осознать, что функция длинновата :)

shty ★★★★★
()
Ответ на: комментарий от AIv

К сожалению при счете это далеко не предел...

при счёте - возможно, но это совсем не факт, что ТС занимается «счётом» :)

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.