Форум сайта python.su
як можна зробити щось таке?:
[crchemist@test normal]$ cat m1.py
a = 10
[crchemist@test normal]$ python
Python 2.5.2 (r252:60911, Jul 5 2008, 03:54:54)
[GCC 4.3.0 20080428 (Red Hat 4.3.0-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import m1
>>> import pickle
>>> pickle.dumps(m1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/crchemist/python-2.5.2/lib/python2.5/pickle.py", line 1366, in dumps
Pickler(file, protocol).dump(obj)
File "/home/crchemist/python-2.5.2/lib/python2.5/pickle.py", line 224, in dump
self.save(obj)
File "/home/crchemist/python-2.5.2/lib/python2.5/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/home/crchemist/python-2.5.2/lib/python2.5/copy_reg.py", line 69, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module obje
class FakeModule(object):
def __reduce__():
....
dumps(FakeModule(m1))
Отредактировано (Ноя. 18, 2008 15:52:28)
Офлайн
не можу зрозуміти copy_reg._reduce_ex:
спочатку йде цикл(61-63):
for base in self.__class__.__mro__:
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
break
if base is self.__class__:
raise TypeError, "can't pickle %s objects" % base.__name__
state = base(self)
Офлайн
знайшов таке вирішення:
[crchemist@test normal]$ python
Python 2.5.2 (r252:60911, Jul 5 2008, 03:54:54)
[GCC 4.3.0 20080428 (Red Hat 4.3.0-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import m1
>>> import yaml
>>> m1_bin = open('m1.bin', 'w')
>>> yaml.dump(m1, m1_bin)
>>> m1_bin.close()
>>>
[crchemist@test normal]$ python
Python 2.5.2 (r252:60911, Jul 5 2008, 03:54:54)
[GCC 4.3.0 20080428 (Red Hat 4.3.0-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> m1_bin = open('m1.bin', 'r')
>>> m1 = yaml.load(m1_bin)
>>> m1
<module 'm1' from 'm1.pyc'>
>>> m1.a
10
>>>
[crchemist@test normal]$ cat m1.py
a = 10
Офлайн
1. модуль в питоне - ОЧЕНЬ ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ. Поэтому его сериализация/десериализация технически возможна (и существует), а вот использование в pickle вызывает несколько вопросов, противоречащих друг другу. Когда было нужно - делал свой import hook, который подтягивал нужные модули откуда следует. Т.е. из того же источника, откуда и pickled data приходит.
2. __flags__ - из C API. Когда объект написан на питоне - не важны, а для old-style классов не существуют.
Но многие объекты на самом деле имеют C реализацию. Например, None, int, list etc…
HEAPTYPE значит, что type object is dynamically allocated - и значит может быть скопирован. На самом деле тот же класс list объявлен как static variable (ускоряет инициализацию) - и не может быть клонирован-сериализован. Он всегда один и тот же. Проверка base is self.__class__ - именно на это. Стандартные питоновские контейнеры обрабатываются в другом месте. А кусок в _reduce_ex просто проверяет, чтобы пользователь не пытался пиклить объекты - C-extension, для этого не предназначенные.
Офлайн
дякую за вичерпну відповідь
Офлайн