ошибка или функция: open и io.open не являются взаимозаменяемыми - PullRequest
5 голосов
/ 04 февраля 2011

Я всегда думал, что 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.6

1 Ответ

7 голосов
/ 04 февраля 2011

Да, это "ошибка", io.open в Python 2.6 немного сломан. Предполагалось, что он будет работать как 3.x open, чтобы облегчить переход, но в некоторых случаях он работает неправильно. Например, он не поддерживает объекты с интерфейсом буфера, как в вашем случае. Это исправлено в Python 2.7, где встроенный open может использоваться как open в 3.x, а io.open это просто псевдоним.

Если вам нужен двоичный режим, используйте open, он ведет себя одинаково в 2.x и 3.x, с той лишь разницей, что в 2.x он принимает для записи объекты, которые он не должен (например, unicode объектов). Если вам нужен текстовый режим, используйте codecs.open или io.open с аргументом encoding. Оба доступны в 3.x.

Но обратите внимание, что open и io.open должны были быть не взаимозаменяемыми, потому что io - это модуль io в Python 3, а в Python 3 open очень отличается от open в Python 2.6 или меньше.

http://docs.python.org/library/io.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...