在Python中将解包参数传递给print时出现语法错误
我想用一个更灵活的日志功能,而不是像这样简单的调试/打印:
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
来开启这个功能。