23

これの代わりに:

FILE = open(f)
do_something(FILE)
FILE.close()

これを使用することをお勧めします:

with open(f) as FILE:
    do_something(FILE)

このようなものがある場合はどうなりますか?

if f is not None:
   FILE = open(f)
else:
   FILE = None
do_something(FILE)
if FILE is not None:
    FILE.close()

do_somethingにも「ifFILEisNone」句があり、その場合でも役立つことがあります。FILEがNoneの場合、do_somethingをスキップしたくありません。

これをwith/asフォームに変換する賢明な方法はありますか?または、オプションのファイルの問題を間違った方法で解決しようとしていますか?

4

7 に答える 7

25

単純に書くとすれば、次のようになります。

if f is not None:
    with open(f) as FILE:
        do_something(FILE)
else:
    do_something(f)

fileビルトインです)

アップデート

以下は、クラッシュしないオプションの None を使用してオンザフライ コンテキストを実行するファンキーな方法です。

from contextlib import contextmanager

none_context = contextmanager(lambda: iter([None]))()
# <contextlib.GeneratorContextManager at 0x1021a0110>

with (open(f) if f is not None else none_context) as FILE:
    do_something(FILE)

None 値を返すコンテキストを作成します。はwith、ファイル オブジェクトとして FILE を生成するか、None 型のいずれかを生成します。しかし、 None タイプには適切な__exit__

アップデート

Python 3.7以降を使用している場合は、より簡単な方法で代役用の null コンテキスト マネージャーを宣言できます。

import contextlib
none_context = contextlib.nullcontext()

これらの詳細については、次を参照してください。

https://docs.python.org/3.7/library/contextlib.html#contextlib.nullcontext

于 2012-08-28T22:11:47.560 に答える
4

これであなたの懸念はすべて解決できそうです。

if file_name is not None:
    with open(file_name) as fh:
        do_something(fh)
else:
        do_something(None)
于 2012-08-28T22:12:50.287 に答える
2

何かのようなもの:

if file:      #it checks for None,false values no need of "if file is None"
    with open(file) as FILE:
        do_something(FILE)
else:
    FILE=None
于 2012-08-28T22:13:03.550 に答える
-3

他のすべての回答は優れており、望ましいものですが、式は任意withの式である可能性があることに注意してください。

with (open(file) if file is not None else None) as FILE:
    pass

else句が評価された場合、Noneこれを生成すると例外が発生することに注意してください。これはNoneType、 がコンテキスト マネージャとして使用される適切な操作をサポートしていないためです。

于 2012-08-28T22:17:10.503 に答える