Почему протокол pickle 2 позволяет мне сериализовать объект открытого файла?

Учтите:

>>> import pickle
>>> thing = open('foobar.txt','w')
>>> pickle.dumps(thing)
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python2.6/pickle.py", line 1366, in dumps
    Pickler(file, protocol).dump(obj)
  File "/usr/lib/python2.6/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib/python2.6/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle file objects

Кажется вполне разумным - конечно, я не могу обработать дескриптор открытого файла. Но:

>>> pickle.dumps(thing, 2)
'\x80\x02c__builtin__\nfile\nq\x00)\x81q\x01.'
>>> pickle.loads(pickle.dumps(thing, 2))
', mode '' at 0x7ff3c078>

Судя по всему, я могу обработать открытый файл, но бесполезно.

Это намеренно? Это маскировало ошибку в моем коде, когда я ошибочно выделял объект, которому принадлежал файл. При некоторых условиях этот объект также содержит курсор pyodbc с тем же результатом

. Я ничего не вижу в PEP 307 об этом. Было ли это просто недосмотром, или я упустил что-то важное, что могло бы позволить мне получить нужное мне исключение даже при травлении с использованием протокола 2?

Я использую Python 2.6.5. Знаю, знаю, но это то, что идет с моим дистрибутивом.

16
задан agf 26 March 2012 в 17:07
поделиться