Написание функции «печать» в Python

1

Я хочу создать функцию, которая работает как встроенная функция печати в 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
  • 0
    @hop - нет, не было.
Теги:
arguments

7 ответов

3
Лучший ответ

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

def log(*args):
    logging.info(' '.join(map(str, args)))
  • 0
    отлично. +1 .......
2

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

def log(*args):
  logging.info(' '.join(args))
  • 0
    Я ищу решение, которое вызывает logging.info ().
  • 0
    имейте в виду, что если args содержит не-строки (как в вопросе), это вызовет исключение. Ответ logging.info(' '.join([str(x) for x in args])) или logging.info(' '.join([str(x) for x in args])) работают лучше.
Показать ещё 2 комментария
1

Я делаю это, чтобы он принял строку формата. Выйдя из мира 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 значительно отличается.

1

Определите функцию, которая принимает переменное количество аргументов, вы можете работать с списком параметров 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

Как насчет:

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

НТН!

  • 3
    некоторое дополнительное понимание списка не было необходимым некоторое время (2.4). ' '.join(str(arg) for arg in args) должно быть достаточно.
0

В один прекрасный день я читал документы 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?")

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

0

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

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

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

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

  • 0
    проще ' '.join(args) как "строку формата". или, может быть, ' '.join(str(a) for a in args) .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню