python 3: проблема с сигнатурой функции журнала - PullRequest
1 голос
/ 04 февраля 2011

Я часто пишу следующий код:

print('object', 'moved', 'from =', object.location, 'dest =', new_location)
print('object', 'created', 'at =', object.location, 'status =', status)

и т. Д.

Я планировал заменить все эти функции log:

def log(self, action, **details):
  print('object', action, end = '')
    for var, value in state.items():
      print(var, '=', value, end = '')
    print()

Это почти работает - за исключением двух проблем. Во-первых, я не могу контролировать порядок вывода, и это важно для меня. Конечно, details - это просто словарь, поэтому порядок параметров теряется. Во-вторых, я не могу использовать какие-либо языковые ключевые слова, например, from в качестве имени аргумента ключевого слова.

Есть ли какое-либо решение, которое позволяет избежать ненужного многословия, но не страдает от этих проблем?

Причина, по которой я хочу использовать функцию log, заключается в том, что я могу захотеть отключить / включить ее или изменить формат в одном месте.

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

Вы знаете о модуле logging , я так понимаю?

Я бы просто использовал предварительно сформированные сообщения и подставил необходимые биты в:

movedmsg = "object moved from = %s to = %s"
print(movedmsg % (object.location, new_location))

Вы можете предпочесть новый стиль форматирования строк:

movedmsg = "object moved from = {0} to = {1}"
print(movedmsg.format(object.location, new_location))

Если вам нужно сделать это с помощью словарной структуры, вы можете создать OrderedDict. Но это немного более многословно. И это не совсем «очевидный способ сделать это».

0 голосов
/ 04 февраля 2011

Самое чистое решение, которое я могу придумать, - вместо этого передать кортеж пар ключ / значение.

def log(action, *details):
    print('object', action, end = '')
    for var, value in details:
        print(var, '=', value, end = '')
    print()

log("moved", ("from", obj.location), ("dest", new_location))

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

def makelogger(*format):
    def logger(action, *args):
        print("object", action, format % args)
    return logger

logger = makelogger("from = %s dest = %s")
logger("moved", obj.location, new_location)

# do a one-off
makelogger("from = %s dest = %s")("moved", obj.location, new_location)

Просто некоторые мысли.

...