質問

これは、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」を使用することで恩恵を受けることです。

役に立ちましたか?

解決

  1. あなたが与えた2つのコードブロックはですいいえ 同等
  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行のコードを保存するだけでなく、声明。

そして、はい、あなたが組み合わせた方法 withtry-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()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top