Я хочу создать функцию, которая работает как встроенная функция печати в Python:

print 'test', i, 'started'

Таким образом, такой вызов должен работать:

log('test', i, 'started)

Функция log должна вызывать функцию logging.info () (из модуля регистрации Python). Как я могу создать такую функцию?

Это моя первая попытка:

import logging
def log(*args):
    logging.info(args)

log('test', i, 'started)

Но вывод не то, что я хочу:

('test', 2, 'started')

Пока должно быть:

test 2 started
2
compie 9 Июл 2010 в 17:22

7 ответов

Лучший ответ

Это работает:

def log(*args):
    logging.info(' '.join(map(str, args)))
5
compie 9 Июл 2010 в 13:36

Однажды я читал документы на python и наткнулся на метод functools.partial () (или я где-то читал об этом - не помню). Небольшая игра привела к следующему коду, который я сейчас помещал в начале каждого написанного мной скрипта Python:

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?")

Поместите это в файл и попробуйте их. Это делает некоторые легко расширяемые функции.

0
user387958 10 Июл 2010 в 01:50

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

def log(*args):
    fmt_string = ' '.join(['%s'] * len(args))
    logging.info(fmt_string, *args)

Это работает, потому что оператор умножения в списках определен для расширения списка копиями содержимого списка.

Обратите внимание, что я передаю *args в качестве второго «аргумента» logging.info - это синтаксис Python для расширения последовательности (я думаю, args будет кортежем) в серию позиционных аргументов в вызове функции.

0
dcrosta 9 Июл 2010 в 13:34

Я делаю это, чтобы заставить его принять строку формата. Исходя из мира Си, мне нравятся мои строки формата. Я использую такой же код в нескольких производственных системах.

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 сильно отличается.

1
Jed Smith 9 Июл 2010 в 17:39

Определив функцию, которая принимает переменное число аргументов, вы можете оперировать списком параметров 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))
1
Stephen 9 Июл 2010 в 13:40

Как насчет:

def log(*args):
    logging.info(' '.join([str(arg) for arg in args]))

HTH!

1
blwy10 9 Июл 2010 в 13:35

Вы можете делать такие вещи:

def log(*args):
  logging.info(' '.join(args))
3
sje397 9 Июл 2010 в 13:40