2017-03-12 5 views
1

私はverbose_printコマンドを使用してコンソールに出力を記録するオープンソースのPythonライブラリに取り組んでいます。現在、それは次のようになります。`stdout.flush`が動作しないコンソールで` print() `が遅れますか?

def sys_write_flush(s): 
    """ Writes and flushes without delay a text in the console """ 
    sys.stdout.write(s) 
    sys.stdout.flush() 


def verbose_print(verbose, s): 
    """ Only prints s (with sys_write_flush) if verbose is True.""" 
    if verbose: 
     sys_write_flush(s) 

私はこのようになります変更提案:別にそれは、Python 2で失敗しているという事実から

def verbose_print(verbose, *args): 
    """ Prints everything passed execpt the first arguement if verbose is True.""" 
    if verbose: 
     print(*args) 

を、私は思った(これを固定するためのボーナスポイント!)これはよりよく、より熟達したものになるでしょう。利点は、最初の引数がTrueまたはFalseでなければならないことを除いて、とまったく同じようにverbose_printを扱うことができるということです。

レポの所有者は、このメッセージに答えた:

私はこの1つを文書化している必要がありますが、基本的に問題は でいくつかのコンソール(およびIPythonのノートブックでは、少なくとも時)、 ということでしたstdout.flushは瞬間的なものですが、 "print"コマンドが遅れてしまうので、私の方法はフィードバックを提供する上でより良い方法でした。

という既知の問題が解決されない限り、印刷するように変更しないでください。

これはまだ有効ですか? print()に続いてsys.stdout.flush()が遅延を避けるでしょうか?これを書くための良い方法はありますか?ドキュメントから

Source

答えて

1

引用:

print順番に各発現を評価し、標準出力に得 オブジェクトを書き込みます。

標準出力は 内蔵モジュールsysstdoutという名前のファイル・オブジェクトとして定義されています。そのようなオブジェクトが存在しない場合、または のメソッドがwrite()の場合、RuntimeError例外が発生します。

これによると、printはい、sys.stdout.flush()print後のINGはsys.stdout.write -ing後flush INGのと同じ効果を持つことになりますやって、sys.stdoutに書き込み、そう。


printは関数ではありませんので、print(*a)は、Python 2で失敗した構文が、声明、そのfun(*stuff)構築物は、機能にのみ適用されます。aが個別の引数として機能printに含まれていますが、これは大きな文字列を渡すに等しいどんなPythonの3 print(*a)パスで

:だから

separator = ' ' 
print separator.join(map(str, iterable)) 

を、あなたのコードは次のようになります。

def verbose_print(verbose, *args): 
    """ Prints everything passed except the first arguement if verbose is True.""" 
    if verbose: 
     print " ".join(map(str, args)) 
     sys.stdout.flush() 

なぜこれがオリジナルよりも速くて読みやすいのかわかりませんが、

関連する問題