510

withPythonのステートメントを使用して複数の変数を宣言することは可能ですか?

何かのようなもの:

from __future__ import with_statement

with open("out.txt","wt"), open("in.txt") as file_out, file_in:
    for line in file_in:
        file_out.write(line)

...または、2つのリソースを同時にクリーンアップすることが問題ですか?

4

8 に答える 8

823

v3.1 以降の Python 3および Python 2.7で可能です。新しいwith構文は、複数のコンテキスト マネージャーをサポートします。

with A() as a, B() as b, C() as c:
    doSomething(a,b,c)

とは異なり、これにより、または のメソッドが例外を発生させた場合でも、およびが呼び出されることがcontextlib.nested保証されます。ab__exit__()C()__enter__()

後の定義で以前の変数を使用することもできます (h/t Ahmad以下):

with A() as a, B(a) as b, C(a, b) as c:
    doSomething(a, c)

Python 3.10 以降では、括弧を使用できます

with (
    A() as a, 
    B(a) as b, 
    C(a, b) as c,
):
    doSomething(a, c)
于 2009-07-02T11:25:50.873 に答える
61

contextlib.nestedこれをサポートします:

import contextlib

with contextlib.nested(open("out.txt","wt"), open("in.txt")) as (file_out, file_in):

   ...

更新:
ドキュメントを引用するには、次の点について説明しますcontextlib.nested

バージョン2.7以降で非推奨:with-statementは、この機能を直接サポートするようになりました(紛らわしいエラーが発生しやすい癖なしで)。

詳細については、 RafałDowgirdの回答を参照してください。

于 2009-05-21T14:55:42.423 に答える
17

代わりにこれを実行したいと思います。

from __future__ import with_statement

with open("out.txt","wt") as file_out:
    with open("in.txt") as file_in:
        for line in file_in:
            file_out.write(line)
于 2009-05-21T14:55:22.890 に答える