Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 18, 2008 15:43:35

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

серіалізація модулів

як можна зробити щось таке?:

[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)

Офлайн

#2 Ноя. 18, 2008 16:14:53

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

серіалізація модулів

не можу зрозуміти copy_reg._reduce_ex:
спочатку йде цикл(61-63):

for base in self.__class__.__mro__:
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
break
далі для module object йде (69-71) для чого потрібні ці рядки? що вони роблять? що таке self.__class__.__flags__?:
if base is self.__class__:
raise TypeError, "can't pickle %s objects" % base.__name__
state = base(self)



Офлайн

#3 Ноя. 18, 2008 18:04:42

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

серіалізація модулів

знайшов таке вирішення:

[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



Офлайн

#4 Ноя. 18, 2008 18:36:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

серіалізація модулів

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, для этого не предназначенные.



Офлайн

#5 Ноя. 18, 2008 18:42:26

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

серіалізація модулів

дякую за вичерпну відповідь



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version