Как 2 словаря Python могут стать 1? [дубликат]

Я использовал бы некоторого необычного декоратора входа или набор их:

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.

И используют файлы журнала, определенные на основе на функцию.

16
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

«Единственный путь», не изменяющий ни один из input dicts, is

basket = dict(basket_one, **basket_two)

В случае конфликта элементы из basket_two будут иметь приоритет над элементами из basket_one . Как идут однострочные, это довольно читабельно и прозрачно, и я не испытываю угрызений совести против его использования каждый раз, когда мне пригодится dict, представляющий собой смесь двух других (любой читатель, у которого есть проблемы с его пониманием, на самом деле будет очень хорошо обслужен тем, как это подсказывает ему или послушайте, чтобы узнать о dict и форме ** ;-). Так, например, такие варианты использования, как:

x = mungesomedict(dict(adict, **anotherdict))

, довольно часто встречаются в моем коде.

Примечание: в Python 3 это будет работать, только если каждый ключ в anotherdict является строкой. См. эти альтернативы .

54
ответ дан 30 November 2019 в 15:18
поделиться
basket = basket_one.copy()
basket.update(basket_two)

(если не требуется, чтобы исходная корзина_one оставалась неизменной, копию можно не указывать)

7
ответ дан 30 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: