在Python中编写'print'函数

时间:2010-07-09 13:22:20

标签: python arguments

我想创建一个像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 个答案:

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

将其放入文件并试用。这使得一些易于扩展的功能成为可能。