2011-11-09 14 views
4
代わりに、簡単なデバッグの

は/このように、印刷のログを記録:構文エラーが

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を使用しています。あなたは、これはとにかく、printとは何の関係もないことを密告する必要がありSyntaxErrorを得ること

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

事実:example in the docsを参照してください。

+0

@テメルいいえ、これは間違っています。私の答えを見てください。あなたが展開しなければ、タプルが得られます。展開すると、いくつかの引数が得られます。これはどこでも許可されます。とにかく、あなたの例は正しいです。この場合、タプルを使う必要があります。 –

2

print messageを直接使用してください。これで十分です(余分な引数のタプルが表示されます)。


リトル以前の回答に加えて:Pythonの2.xでは、printは機能が、声明ではないが、しかしprint(arg1, arg2)は有効です...タプル(arg1, arg2)printステートメントを使用して。

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

さて、ほかにthemelの答えに:

ケース1:引数を展開する*を使用していない1を見ることができるよう

この

print arg1, arg2とは少し異なっていますタプル

>>> 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',),) 

結果はタプルのタプルです。

ケース2pで引数を拡大:

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

結果はpに与えられた引数のタプルです。

したがって*argsは正しい使用ですが、これはステートメントでは許可されていません。

+1

ここでの主な問題は、_print_が文(ファンキーなもの)であり、その文がアンパックされた引数をサポートしていないということです。 – hobb

+0

'print message'を使用するとタプルを直接出力します。 "( 'error'、22)"の代わりに "error 22"を使用します。投稿する前にそれを試してみたが、私が望んでいたものではなかった。 – hobb

+0

次に、あなたのコード 'print(" error "、error_number)'があなたの期待したことをしていましたか? print( 'error'、3) 'prints'( 'error'、3) 'とし、' error 3 'ではなく 'no'と答えます。それでは、新しいバージョンのプリントが必要でした。 –

7

あなたが__future__を使用したくない場合は、このようなロギング機能を定義することができます

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