11

with open('filename') as f誰かが自分のコードを投稿すると、「今すぐ構文を使うべきだ」という余談が追加されることがよくあります。昔ながらのf = open()ステートメントのほとんどに が付随していないことに同意し.close()ます。また、この「暗黙のクローズ」への依存がプログラミングの問題の全体的な原因であるという質問にも答えました。

ただし、場合によっては、コードをwithブロック内にネストすると、コードを記述する際に別の不都合が生じることがあります。たとえば、私はときどきフラグを先頭に使ってwritefile = True. これにより、同じ処理スレッドを維持しながら、使用する場合にのみファイルを開いたり閉じたりできます。コードのさまざまな場所で、画面に出力したり、ファイルに書き込んだりできます。stdout(最初にまたはファイルを開き、代わりにそのアプローチを使用することに気づきました。)

私の質問は次のとおりです:ファイルを明示的に閉じる必要がないことに加えて、ファイル、特に出力ファイルを処理するために構文を使用する他の理由はありますか? with(「よりpythonic」自体は理由ではありません。)これが重複している場合は、これを指摘していただければ幸いですが、自分で見つけることができませんでした。

4

4 に答える 4

10

の他の利点はありませんwith。クリーンアップを確実にすることだけが目的です。

例外が発生した場合にファイルを閉じるには、スコープ付きブロックが必要です。

writefile = random.choice([True, False])
f = open(filename) if writefile else None
try:
    # some code or other
finally:
    if writefile:
        f.close()

したがって、あなたが欠点として説明していることは、どのように記述しても、with実際には正しいコードの欠点です (クリーンアップが必要な場合)。

于 2013-10-31T16:13:24.173 に答える
3

何らかのクリーンアップ/ファイナライズが行われることを保証したいと考えています。それが の使い方ですwith

はい、ほとんどの場合、ファイルを閉じたいと考えていますが、他の例を考え出すこともできます。

PEP 343にはファイル以外の例があります:

ブロックの開始時に取得されたロックが、ブロックを離れたときに解放されることを保証するためのテンプレート:

@contextmanager
def locked(lock):
    lock.acquire()
    try:
        yield
    finally:
        lock.release()

次のように使用します。

with locked(myLock):
    # Code here executes with myLock held.  The lock is
    # guaranteed to be released when the block is left (even
    # if via return or by an uncaught exception).
于 2013-10-31T16:13:18.540 に答える