のうち、発電機を取る私は、次のコードを見ましたか?コンテキストマネージャーは、linegen
がまだファイルハンドルへの参照を持っていることを知り、コンテキストが残っているときに閉じられないようにスマートになっていますか?または、これは潜在的に危険ですか?は、コンテキストマネージャ
2
A
答えて
2
これはPythonで、それらの重大な変更の一つである3
あなたの質問のタイトル(発電を撮影...)あなたは、Python 3のコードとして、それを読んでいる暗示。
しかし声明
from __future__ import print_function
は、それが実際のリストを返すmap
のPython 2では、Pythonの2
のために書かれた意味 - したがって、このコードは両方とも完全に安全とextrmely賢明である(すなわち開きますファイル、すべての行を読んで、あなたが行くように)ファイルを閉じ、Pythonの3では
In [2]: with open('README.md','r') as f:
...: lines = map(str.strip, f)
...:
In [3]: lines
Out[3]:
['ASM',
'============',
'',
それらをトリップS、同じコードが例外をスロー
In [1]: with open('README.md','r') as f:
lines = map(str.strip, f)
...:
In [2]: lines
Out[2]: <map at 0x7f4d393c3ac8>
In [3]: list(lines)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-3-2666a44c63b5> in <module>()
----> 1 list(lines)
ValueError: I/O operation on closed file.
あなたはこのバージョンセーフな実装をしたい場合は、
lines = list(map(str.strip, f))
か、単にリスト内包
lines = [l.strip() for l in f]
+0
'from future_builtins import map'はPython 2で' map 'ジェネレータを生成する。私はオープンリファレンス対コンテキストを優先させることに興味があった。誰もが一貫して例外を取得しているので、コンテキストが勝つように見えます。是非、質問を終わらせてください。 – Stefan
関連する問題
- 1. 非同期コンテキストマネージャ
- 2. コンテキストマネージャでスレッドを使用するには?
- 3. Pythonコンテキストマネージャをネストする
- 4. Python:標準関数とコンテキストマネージャ?
- 5. PythonのMySQLdb用のコンテキストマネージャ
- 6. コンテキストマネージャのネストの検出
- 7. 2.7 Pythonコンテキストマネージャをスレッドセーフにする方法
- 8. PythonのMySQLとコンテキストマネージャ:__exit__属性エラー
- 9. StringIOと 'with'ステートメント(コンテキストマネージャ)との互換性
- 10. Pythonコンテキストマネージャ例外を渡さない
- 11. Goでコンテキストマネージャを作成することはできますか?
- 12. なぜコンテキストマネージャはファイルディスクリプタを閉じていませんか?
- 13. pd.read_csvでCSVファイルを開く - コンテキストマネージャの目的は何ですか?
- 14. ラムダでコンテキストマネージャを使用する方法は?
- 15. コンテキストマネージャから「中断する」ことはできますか?
- 16. self.assertRaisesを非同期コンテキストマネージャとして使用できますか?
- 17. with文とコンテキストマネージャの__exit__メソッドからの復帰
- 18. リスト内包を持つPythonのネストされたコンテキストマネージャ
- 19. コンテキストマネージャ用のモックがAttributeErrorで失敗しました:__exit__
- 20. 例外でコンテキストマネージャを使用する方法
- 21. コンテキストマネージャ内での関数の部分的な適用( "with ..")
- 22. Python 3で非同期コンテキストマネージャをネストする方法
- 23. Matlabのコンテキストマネージャ:Matlabで__enter__を呼び出す
- 24. コンテキストマネージャを関数として使用する
- 25. Python 2.7でクラスを使わずにデコレータとしてコンテキストマネージャを作る方法は?
- 26. http要求、コンテキストマネージャまたはカスタムログレベルのログノイズを削減しますか?
- 27. aiohttpのデリゲート/ネストされた非同期コンテキストマネージャを作成するには?
- 28. Pythonコンテキストマネージャはどのようにしてコードを実行できますか?
- 29. Pythonコンテキストマネージャから__exit__の戻り値を取得できますか?
- 30. Pythonなぜsqlite3カーソルのコンテキストマネージャを記述しないのですか?
を使用するリストに発電機を変換するために、いずれかの必要があるが、あなたはそれを試してみました? –
*潜在的に*安全ではない、*安全ではありません。クローズされたファイルからの読み取りを試みることによって発生した例外を見ることができます。 – chepner
これは単に間違っています –