2011-11-09 51 views
4

而不是一個簡單的調試/日誌打印,因爲這:語法錯誤傳遞解壓的說法在Python打印時

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的方式......

+0

我添加的方式來修改你的腳本,而不使用'__future__'模塊;看到我的答案。 –

回答

7

print不是Python 2.x中的函數。在第一個片段中,您正在打印一個元組,而最後一個元素的語法無效。如果您想使用打印功能,則需要通過from __future__ import print_function啓用它。

-2

你只需要使用*args聲明參數元組,而不是對其進行訪問。見example in the docs

def write_multiple_items(file, separator, *args): 
    file.write(separator.join(args)) 

事實上,你會得到一個SyntaxError應該提示你,這已經無關print,反正。

+0

@themel不,這是錯誤的,看我的回答:如果你不擴展,你會得到一個元組;如果你擴展,你會得到幾個參數。這可以在任何地方進行無論如何,你的例子是正確的,因爲在這種情況下,你需要使用元組。 –

2

您應該直接使用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是正確的用法,但這是不允許的聲明。

+1

這裏的主要問題是_print_是一個聲明(一個質樸的),並且聲明不支持解壓參數(即使它們是時髦的變量參數接受語句) – hobb

+0

使用'print message'直接打印元組爲「('錯誤',22)」而不是「錯誤22」。試過之前發佈,但它不是我想要的。 – hobb

+0

然後,問題:你的代碼是'print(「error」,error_number)'做你期望的事情?我會說不,因爲print('error',3)'直接打印'('error',3)'而不是'error 3'。所以這是正確的,你需要新版本的印刷品。 –

7

如果你不想使用__future__,您可以定義日誌功能是這樣的:

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