我想创建一个像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
答案 0 :(得分:4)
这有效:
def log(*args):
logging.info(' '.join(map(str, args)))
答案 1 :(得分:2)
你可以做这件事:
def log(*args):
logging.info(' '.join(args))
答案 2 :(得分: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))
答案 3 :(得分:1)
怎么样:
def log(*args):
logging.info(' '.join([str(arg) for arg in args]))
HTH!
答案 4 :(得分: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差别很大。
答案 5 :(得分:0)
日志记录方法需要使用format-string作为第一个参数(或者,正如其他人所建议的那样,需要记录一个文字字符串)。您可以使用以下代码轻松生成给定数量参数的格式字符串:
def log(*args):
fmt_string = ' '.join(['%s'] * len(args))
logging.info(fmt_string, *args)
这是有效的,因为列表上的乘法运算符被定义为使用列表内容的副本扩展列表。
请注意,我将*args
作为第二个“参数”传递给logging.info
- 这是Python扩展序列的语法(我相信args
将是一个元组)进入函数调用中的一系列位置参数。
答案 6 :(得分:0)
有一天,我正在阅读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?")
将其放入文件并试用。这使得一些易于扩展的功能成为可能。