Try-Exceptブロックを使用してPython「with」ステートメントを使用します
-
30-09-2019 - |
質問
これは、Try-Exectブロックと組み合わせてPython "with"ステートメントを使用する正しい方法ですか?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
もしそうなら、物事を行う古い方法を考慮してください:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
ここでの「with with」ステートメントの主な利点は、3行のコードを取り除くことができるということですか?それは私にとってそれほど説得力がないようです このユースケースの場合 (「with with」ステートメントには他の用途があることを理解していますが)。
編集:上記の2つのコードブロックの機能は同一ですか?
edit2:最初の数回の回答は、一般的に「with」を使用することの利点について話しますが、ここではわずかな利益のようです。私たちは皆、長年にわたってF.Close()を明示的に呼び出してきました(またはそうすべきだった)。 1つの利点は、ずさんなコーダーが「with」を使用することで恩恵を受けることです。
解決
- あなたが与えた2つのコードブロックはですいいえ 同等
- あなたが説明したコード 物事の古い方法 深刻なバグがあります:ファイルを開くと失敗した場合、2番目の例外が得られます
finally
節からf
バインドされていません。
同等の古いスタイルのコードは次のとおりです。
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
ご覧のとおり、 with
ステートメントにより、物事が発生しやすくなります。 Python(2.7、3.1)の新しいバージョンでは、複数の式を1つに組み合わせることもできます。 with
声明。例えば:
with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
それに加えて、私は個人的には、できるだけ早く例外をキャッチするのは悪い習慣だと考えています。これは例外の目的ではありません。故障する可能性のあるIO関数がより複雑な操作の一部である場合、ほとんどの場合、IOErrorは操作全体を中止し、外側レベルで処理する必要があります。使用 with
ステートメント、これらすべてを取り除くことができます try...finally
内部レベルでのステートメント。
他のヒント
の内容の場合 finally
ブロックは、開くファイルオブジェクトのプロパティによって決定されます。ファイルオブジェクトの実装者が書くべきではないのはなぜですか finally
ブロック? そうです の利点 with
この特定の例では、3行のコードを保存するだけでなく、声明。
そして、はい、あなたが組み合わせた方法 with
と try-except
その中に例外的なエラーが発生したため、それを行う唯一の方法です open
声明自体は内に捉えることはできません with
ブロック。
「ラインを減らすだけである」という声明で、あなたはそれが間違っていると思います。実際に初期化を行い、断片を処理します。
あなたの場合、「with」はそうです
- ファイルを開き、
- その内容を処理します
- 必ず閉じてください。
「」と理解するためのリンクは次のとおりです。 http://effbot.org/zone/python-with-statement.htm
編集:はい、「with」の使用法は正しく、コードの両方のブロックの機能は同じです。 「with」を使用する理由についての質問?それはあなたがそれで得る利益のためです。誤ってF.Close()が欠けていることについて言及したように。
次のコードのより多くのPythonic方法は次のとおりです。
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
try:
f = open("file", "r")
except IOError:
<whatever>
else:
f.close()