2011-02-04 9 views
5

私はいつもopenio.openは互換性があると思いました。バグまたは機能:openとio.openは互換性がありません

import ctypes, io 

class POINT(ctypes.Structure): 
    _fields_ = [("x", ctypes.c_int),("y", ctypes.c_int)] 
# THIS WORKS 
with open("mypoints.bin", "wb") as f: 
    for i in range(10): 
     p = POINT(i,10-i) 
     print p.x, p.y 
     f.write(p) 
# THIS FAILS 
with io.open("mypoints.bin", "wb") as f: 
    for i in range(10): 
     p = POINT(i,10-i) 
     print p.x, p.y 
     f.write(p) 

0 10 
Traceback (most recent call last): 
    File "D:\test.py", line 10, in <module> 
    f.write(p) 
    File "c:\Python26\lib\io.py", line 1070, in write 
    self._write_buf.extend(b) 
TypeError: 'POINT' object is not iterable 

注:私はこのスニペットを信じるならば
はどうやらない、私ははい、それは "バグ" やPython 2.6でio.openが少し壊れているのですPythonの2.6.6

答えて

7

でテスト。移行を容易にするためには、3.xのopenのような作業が想定されていましたが、場合によっては正しく動作しません。たとえば、あなたの場合のようにバッファインターフェイスを持つオブジェクトをサポートしていません。これは、Python 2.7で修正されています。openは、3.xのopenのように使用でき、io.openは単なるエイリアスです。

バイナリモードが必要な場合は、openを使用してください。2.xと3.xで同じ動作をしますが、2.xでは唯一の違いは、オブジェクトを書くことができない点です(例:unicodeオブジェクト)。テキストモードが必要な場合は、codecs.openまたはio.openencoding引数を使用してください。どちらも3.xで利用可能です。

しかしopenio.openioは、Python 3のioモジュールであり、とPython 3にopenは、Python 2.6でopen以下と非常に異なっているので、交換可能ではないに意味していたことに注意してください。

+0

私はこのバグがPython 2.7で修正されたことを確認します。どうもありがとう。 – Alain

関連する問題