2016-07-14 2 views
2

のうち、発電機を取る私は、次のコードを見ましたか?コンテキストマネージャーは、linegenがまだファイルハンドルへの参照を持っていることを知り、コンテキストが残っているときに閉じられないようにスマートになっていますか?または、これは潜在的に危険ですか?は、コンテキストマネージャ

+0

を使用するリストに発電機を変換するために、いずれかの必要があるが、あなたはそれを試してみました? –

+0

*潜在的に*安全ではない、*安全ではありません。クローズされたファイルからの読み取りを試みることによって発生した例外を見ることができます。 – chepner

+1

これは単に間違っています –

答えて

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

関連する問題