Я хочу создать функцию, которая работает как встроенная функция печати в 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
7 ответов
Это работает:
def log(*args):
logging.info(' '.join(map(str, args)))
Однажды я читал документы на 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?")
Поместите это в файл и попробуйте их. Это делает некоторые легко расширяемые функции.
Методы регистрации требуют в качестве первого аргумента строку форматирования (или, как некоторые другие предложили, литеральную строку для регистрации). Вы можете легко сгенерировать строку формата для заданного числа аргументов с помощью кода примерно так:
def log(*args):
fmt_string = ' '.join(['%s'] * len(args))
logging.info(fmt_string, *args)
Это работает, потому что оператор умножения в списках определен для расширения списка копиями содержимого списка.
Обратите внимание, что я передаю *args
в качестве второго «аргумента» logging.info
- это синтаксис Python для расширения последовательности (я думаю, args
будет кортежем) в серию позиционных аргументов в вызове функции.
Я делаю это, чтобы заставить его принять строку формата. Исходя из мира Си, мне нравятся мои строки формата. Я использую такой же код в нескольких производственных системах.
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]))
HTH!
Вы можете делать такие вещи:
def log(*args):
logging.info(' '.join(args))
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.