在Python中将解包参数传递给print时出现语法错误

5 投票
4 回答
3580 浏览
提问于 2025-04-17 05:55

我想用一个更灵活的日志功能,而不是像这样简单的调试/打印:

print "error ", error_number

我希望这个日志功能可以根据需要扩展,像这样:

def log(condition, *message):
    if(<do something here...>):
        print(*message)
        <perhaps do something more...>

然后我想这样调用它:

log(condition, "error ", error_number)

但是我遇到了以下语法错误:

print *message
      ^ SyntaxError: invalid syntax

这是打印功能的限制吗?还是说有什么方法可以让它正常工作?如果不行,有没有类似于打印的功能可以使用?

顺便说一下,我使用的是Python 2.7……

4 个回答

3

你可以直接使用 print message,这样就够了(它会打印出额外参数的元组)。


补充一下之前的回答:在 Python 2.x 中,print 不是一个函数,而是一个语句,但是 print(arg1, arg2) 是有效的……这就相当于在元组 (arg1, arg2) 上使用 print 语句。

这和 print arg1, arg2 有点不同,大家可以看到:

>>> print 'aaa', 'bbb'
aaa bbb
>>> print('aaa', 'bbb')
('aaa', 'bbb')

现在,除了 themel 的回答之外:

情况 1:没有使用 * 来展开参数元组

>>> def p(*args):
...     a(args)  # <== args is a tuple
>>> def a(*args):
...     print args  # <== args is a tuple (but nothing else can be used)
>>> p('bb')
(('bb',),)

结果是一个元组的元组。

情况 2:在 p 中展开参数:

>>> def p(*args):
...      a(*args)  # <== now arguments are expanding
...
>>> p('bb')
('bb',)

结果是传递给 p 的参数元组。

所以 *args 是正确的用法,但在语句中是不允许的。

7

如果你不想使用 __future__ 这个功能,可以这样定义日志记录的函数:

def log(condition, *message):
    if(<do something here...>):
        print ' '.join(str(a) for a in message)
        <perhaps do something more...>
9

print 在 Python 2.x 里不是一个函数。在你提到的第一个例子中,你是在打印一个元组,而最后一个例子里的语法是错误的。如果你想用 print 作为函数来使用,你需要通过 from __future__ import print_function 来开启这个功能。

撰写回答