Я использовал бы некоторого необычного декоратора входа или набор их:
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, таким образом, значения по умолчанию будут распечатаны, если они будут присутствовать, но это - другой вопрос.
необходимо, вероятно, использовать приблизительно [1 113] logger
модуль вместо сырых данных print
операторы, но я хотел сфокусироваться на идее декоратора и постараться не делать код слишком долго.
Так или иначе - с таким декоратором Вы получаете вход функционального уровня, произвольно много уровней журнала, простоты приложения к новой функции, и отключить вход Вас только должно установить LOGLEVEL. И можно определить различные выходные потоки/файлы для каждой функции, если Вы желаете. Можно записать doLogging как:
def doLogging(logThreshold, outStream=sys.stdout):
.....
print >>outStream, ">>Called %s at %s" etc.
И используют файлы журнала, определенные на основе на функцию.
«Единственный путь», не изменяющий ни один из input dicts, is
basket = dict(basket_one, **basket_two)
В случае конфликта элементы из basket_two
будут иметь приоритет над элементами из basket_one
. Как идут однострочные, это довольно читабельно и прозрачно, и я не испытываю угрызений совести против его использования каждый раз, когда мне пригодится dict, представляющий собой смесь двух других (любой читатель, у которого есть проблемы с его пониманием, на самом деле будет очень хорошо обслужен тем, как это подсказывает ему или послушайте, чтобы узнать о dict
и форме **
;-). Так, например, такие варианты использования, как:
x = mungesomedict(dict(adict, **anotherdict))
, довольно часто встречаются в моем коде.
Примечание: в Python 3 это будет работать, только если каждый ключ в anotherdict
является строкой. См. эти альтернативы .
basket = basket_one.copy()
basket.update(basket_two)
(если не требуется, чтобы исходная корзина_one оставалась неизменной, копию можно не указывать)