Pythonの声明で「 'でネスト」
-
22-09-2019 - |
質問
「with」はインターネットで検索するのが面白い言葉であることがわかります。
Pythonの声明でネストとの取引が何であるかを知っている人はいますか?
私は書いているスクリプトで非常に滑りやすいバグを追跡してきましたが、それは私がこれをやっているからだと思います。
with open(file1) as fsock1:
with open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
私がしようとすると、Pythonがスローアップします read()
FSOCK2から。デバッガーで検査すると、これはファイルが空であると思われるためです。これは、デバッグインターパーターでまったく同じコードを実行しないという事実を除いて、心配することはありません。 with
ステートメントは、ファイルが実際にテキストでいっぱいであることを示しています...
私は今のところ営巣しているという仮定を進めます with
声明はノーノーですが、もっと知っている人が異なる意見を持っているなら、私はそれを聞いてみたいです。
解決
Pythonのドキュメントで解決策を見つけました。あなたは見たいかもしれません これ(Python 3) また これ(Python 2)
Python 2.7+を実行している場合は、次のように使用できます。
with open(file1) as fsock1, open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
これにより、不必要なインデンテーションを避けます。
他のヒント
AFAIK付録モードで開くファイルを読み取ることができません 'a'
.
デバッガーで検査すると、これはファイルが空であると思われるためです。
それは実際に何も読めないので起こると思います。たとえ可能であっても、ファイルに追加されたときに、書き込みが発生する準備のために、シークポインターがファイルの最後に移動されます。
これらは with
ステートメントは私にとってうまく機能します:
with open(file1) as f:
with open(file2, 'r') as g: # Read, not append.
fstring1 = f.read()
fstring2 = g.read()
の使用に注意してください contextlib.nested
, 、別のポスターが示唆しているように、ここで危険にさらされる可能性があります。あなたがこれをするとしましょう:
with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
...
ここのコンテキストマネージャーは、一度に1つずつ作成されます。つまり、File2の開くことが失敗した場合(たとえば、存在しないため)、File1を適切に完成させることができず、ガベージコレクターに任せる必要があります。それは潜在的に非常に悪いことです。
ネスティングに問題はありません with
ステートメント - むしろ、あなたは開いています file2
追加の場合、それから読むことができません。
あなたがネストを嫌うなら with
声明は、何らかの理由で、しばしばそれを避けることができます contextlib.nested 関数。ただし、壊れたコード(たとえば、追加のファイルを開いてから代わりに読み込もうとするコード)は機能しません。 with
ステートメントは、そうでなければ良いコードを破ります。
「with」を検索することに関しては、単語を「+」で接頭することで、Googleが無視することができなくなります。