Рассмотрим:
>>> import pickle
>>> thing = open('foobar.txt','w')
>>> pickle.dumps(thing)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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))
<closed file '<uninitialized file>', mode '<uninitialized file>' at 0x7ff3c078>
По-видимому, я могу раскрыть открытый файл, просто не полезно.
Это намеренно? Это скрывало ошибку в моем коде, где я ошибочно травил объект, в котором находился файл. В некоторых условиях этот объект также содержит курсор pyodbc
с тем же результатом.
Я ничего не вижу в PEP 307 об этом. Был ли это просто надзор, или есть что-то важное, что я пропал без вести, что может позволить мне получить исключение, которое я хочу, даже при травлении с использованием протокола 2?
Я использую Python 2.6.5. Я знаю, я знаю, но это то, что приходит с моим распределением.