Я бы использовал какой-нибудь необычный декоратор журналирования или их кучу:
def doLogging(logTreshold):
def logFunction(aFunc):
def innerFunc(*args, **kwargs):
if LOGLEVEL >= logTreshold:
print ">>Called %s at %s"%(aFunc.__name__, time.strftime("%H:%M:%S"))
print ">>Parameters: ", args, kwargs if kwargs else ""
try:
return aFunc(*args, **kwargs)
finally:
print ">>%s took %s"%(aFunc.__name__, time.strftime("%H:%M:%S"))
return innerFunc
return logFunction
Все, что вам нужно, это объявить константу LOGLEVEL в каждом модуле (или просто глобально и просто импортировать ее во все модули), а затем вы можете использовать ее следующим образом:
@doLogging(2.5)
def myPreciousFunction(one, two, three=4):
print "I'm doing some fancy computations :-)"
return
И если LOGLEVEL не меньше 2,5, вы получите вывод, подобный этому:
>>Called myPreciousFunction at 18:49:13
>>Parameters: (1, 2)
I'm doing some fancy computations :-)
>>myPreciousFunction took 18:49:13
Как видите, для лучшей обработки kwargs требуется некоторая работа, поэтому значения по умолчанию будут напечатаны, если они присутствуют, но это другой вопрос.
Вы, вероятно, должны использовать какой-то модуль logger
вместо необработанных print
операторов, но я хотел сосредоточиться на идее декоратора и не делать код слишком длинным.
В любом случае - с таким декоратором вы получаете протоколирование на уровне функций, произвольное количество уровней журналирования, простоту применения к новой функции и отключение журналирования, вам нужно только установить LOGLEVEL. И вы можете определить различные выходные потоки / файлы для каждой функции, если хотите. Вы можете написать doLogging как:
def doLogging(logThreshold, outStream=sys.stdout):
.....
print >>outStream, ">>Called %s at %s" etc.
И использовать файлы журналов, определенные для каждой функции.