Я хочу создать функцию, которая работает как встроенная функция печати в Python:
print 'test', i, 'started'
Итак, такой вызов должен работать:
log('test', i, 'started)
Функция журнала должна вызывать функцию logging.info() (из модуля регистрации Python). Как я могу создать такую функцию?
Это моя первая попытка:
import logging
def log(*args):
logging.info(args)
log('test', i, 'started)
Но результат не то, что я хочу:
('test', 2, 'started')
Пока это должно быть:
test 2 started
Это работает:
def log(*args):
logging.info(' '.join(map(str, args)))
Вы можете делать такие вещи:
def log(*args):
logging.info(' '.join(args))
logging.info(' '.join([str(x) for x in args]))
или logging.info(' '.join([str(x) for x in args]))
работают лучше.
Я делаю это, чтобы он принял строку формата. Выйдя из мира C, мне нравятся строки в формате. Я использую код точно так же в нескольких производственных системах.
def logf(fmt, *args):
try: m = fmt % args
except:
# Catch mismatch between fmt/args; prevents logging.info from
# failing below, as well.
m = fmt
fmt = "%s"
if DEBUG:
stderr.write("[%s] %s\n" % (time.asctime(), m))
logging.info(fmt, *args)
Использование:
logf("There are %u entries in the list, and my mood is %s.", len(L), "sad")
logf("It works without arguments, as well")
logf("Test %d started", i)
Назовите меня старой школой, я думаю. Это все Python 2, между прочим - 3 значительно отличается.
Определите функцию, которая принимает переменное количество аргументов, вы можете работать с списком параметров args
, чтобы напечатать его, как вам хотелось бы:
>>> def log(*args):
... print args
>>> log("a", 1, "b")
("a", 1, "b")
Или:
>>> def log(*args):
... for a in args: # <- loop over the arguments
... print a, # <- notice the comma that says "no newline".
... print # <- force a newline after the log statement.
>>> log("a", 1, "b")
a 1 b
Если вы хотите использовать logging.info
:
logging.info(msg [, * args [, ** kwargs]])
Записывает сообщение с уровнем INFO в корневом журнале. Аргументы интерпретируются как для debug().
>>> def log(*args):
... logging.info(" ".join("%s" %a for a in args))
Как насчет:
def log(*args):
logging.info(' '.join([str(arg) for arg in args]))
НТН!
' '.join(str(arg) for arg in args)
должно быть достаточно.
В один прекрасный день я читал документы python, и я наткнулся на метод functools.partial() (или я читал об этом где-то - я не помню). Маленькая игра привела к следующему коду, который я теперь ввел в начало каждого python script Я пишу:
import sys, functools nl = "\n" def StreamOut(stream, *s, **kw): k = kw.setdefault # Process keyword arguments sep = k("sep", "") auto_nl = k("auto_nl", True) prefix = k("prefix", "") convert = k("convert", str) # Convert position arguments to strings strings = map(convert, s) # Dump them to the stream stream.write(prefix + sep.join(strings)) # Add a newline if desired if auto_nl: stream.write(nl) out = functools.partial(StreamOut, sys.stdout) outs = functools.partial(StreamOut, sys.stdout, sep=" ") dbg = functools.partial(StreamOut, sys.stdout, sep=" ", prefix="+ ") err = functools.partial(StreamOut, sys.stderr) out("Hi there", "how are you?") outs("Hi there", "how are you?")
Поместите его в файл и попробуйте. Это делает некоторые легко расширяемые функции.
Для методов ведения журналов требуется строка формата в качестве первого аргумента (или, как предложили некоторые другие, литерала для ведения журнала). Вы можете легко создать строку формата для заданного числа аргументов с кодом примерно так:
def log(*args):
fmt_string = ' '.join(['%s'] * len(args))
logging.info(fmt_string, *args)
Это работает, потому что оператор умножения в списках определен для расширения списка с копиями содержимого списка.
Обратите внимание, что я передаю *args
как второй "аргумент" на logging.info
- это синтаксис Python для расширения последовательности (args
будет кортежем, я полагаю) в ряд позиционных аргументов в вызове функции.
' '.join(args)
как "строку формата". или, может быть, ' '.join(str(a) for a in args)
.