3

私たちのチームは以下のようにスニペットする必要があります:

これ:

buf = StringIO.StringIO()
gzip.GzipFile(fileobj=buf, mode='wb').write(foo)
...

そしてこれ:

buf = StringIO.StringIO()
tmp = gzip.GzipFile(fileobj=buf, mode='wb')
tmp.write(foo)
...

どちらがよりpythonicですか?

編集:エラー処理作業を行うためのtry / catchがありますが、どちらがよりpythonicですか?

4

3 に答える 3

11

GzipFile終了したらオブジェクトを閉じる必要があるため、1行は機能しません。代わりに、コンテキストマネージャー式を使用してください。

buf = StringIO.StringIO()
with gzip.GzipFile(fileobj=buf, mode='wb') as tmp:
    tmp.write(foo)

ワンライナーgzip.GzipFile(fileobj=buf, mode='wb').write(foo)は、式の最後でガベージコレクションされてストリームがフラッシュされることに依存するため、非常に危険です。GzipFileこれが発生しない場合(たとえば、Jythonを使用)buf、期待される結果は含まれません。

于 2012-07-30T11:26:08.473 に答える
3

どちらでも構いません。最も読みやすいと思うものを選択してください。

個人的には、最初のものを使用します。追加の変数を使用しても、何も追加されません

とは言うものの、このコンテキストでは、ecatmurは、すべてのデータをインスタンスに書き込んだ後にインスタンスを閉じる必要があるということは正しいです。GZipFileこれにより、圧縮データがフラッシュされ、 gzipCRCbufとサイズ情報が追加されます。これがないと、データが不完全になる可能性があります。

于 2012-07-30T11:22:43.483 に答える
0

例えば、

Man.eat.work.sleep()

ruby/javascript styleメソッドの連鎖はruby/javascriptで一般的ですが、そうではないと思いますpythonic

于 2012-07-30T12:12:44.570 に答える