Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 12, 2007 17:34:25

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

pickle и словари в подобъектах класса

Такая странная грабля, извиняюсь за много кода, взято из реального исходника, на случай если у меня чегойто с глазами.

Есть класс:
#RRDPolicy.py
class RRDPolicy:
ds = {}
dsnames =
rra =
datasource_types=
consolidations=
step = 1


def __init__(self,config=“none”):
if config<>“none”:
self.extract_policy_from_config(config)
def setstep(self,step):
if step>0:
self.step=step

def addDS(self, name, dst, heartbeat, min=“U”, max=“U”):
#DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
if dst not in self.datasource_types:
raise RRDPolicyError(“Data source type %s unknown!”%dst)
self.dsnames+=name,
self.ds=

def addRRA(self, consolidation, xff, rra_step_duration, lifetime):
#RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
if consolidation not in self.consolidations:
raise RRDPolicyError(“Consolidation %s unknown!”%consolidation)
self.rra+=,

——————————————————————————————————–
Записываем объект в файл
#test1.py
#!/usr/bin/env python

from RRDPolicy import RRDPolicy
import cPickle as pickle


class superClass:
policy=RRDPolicy()

def __init__(self):
pass

if __name__==“__main__”:
s=superClass()
s.policy=RRDPolicy()
s.policy.setstep(20)
s.policy.addDS(“val1”,“GAUGE”,60,0,999999999999)
s.policy.addRRA(“LAST”,0.5,60,3600*24*40)
t=file(“temp.pkl”,“w”)
pickle.dump(s,t)
print s.policy.ds
print s.policy.rra
print s.policy.dsnames
t.close()
———————
результат
———————
>{'val1': }
>[]
>


——————————————————————————————-
считываем объект из файла:
#test2.py
#!/usr/bin/env python

from RRDPolicy import RRDPolicy
import cPickle as pickle

class superClass:
policy=RRDPolicy()

def __init__(self):
pass


t=file(“temp.pkl”,“r”)
s=pickle.load(t)
print s.policy.ds
print s.policy.rra
print s.policy.dsnames
t.close()

——————
результат
——————

>{}
>[]
>
———————-

Внимание вопрос: куды запропастились значения из словаря ds?

В описании pickle не обнаружил никаких ньюансов насчет словарей.

Ктонибудь видит грабли?

Заранее спасибо за любой ответ.



Офлайн

#2 Фев. 13, 2007 05:54:56

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

pickle и словари в подобъектах класса

Насколько я понял, проблема в том, что все данные-члены - статические. Видимо, pickle их как-то не так сохраняет.
Если усугубить ситуацию и удалить из файла test1.py строку s.policy=RRDPolicy() (вначале я не понял, зачем в класс s член policy два раза добавляется, теперь догадываюсь…), то policy тоже будет статическим и результат test2 станет вообще пустым.
Если из определения класса строчки
ds = {}
dsnames =
rra =
перенести в конструктор:

def __init__(self,config=“none”):
self.ds = {}
self.dsnames =
self.rra =
if config<>“none”:
self.extract_policy_from_config(config)

то всё нормально сохраняется



Офлайн

#3 Фев. 13, 2007 11:37:21

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

pickle и словари в подобъектах класса

Striver
Насколько я понял, проблема в том, что все данные-члены - статические. Видимо, pickle их как-то не так сохраняет.
Если усугубить ситуацию и удалить из файла test1.py строку s.policy=RRDPolicy() (вначале я не понял, зачем в класс s член policy два раза добавляется, теперь догадываюсь…), то policy тоже будет статическим и результат test2 станет вообще пустым.
Если из определения класса строчки
ds = {}
dsnames =
rra =
перенести в конструктор:

def __init__(self,config=“none”):
self.ds = {}
self.dsnames =
self.rra =
if config<>“none”:
self.extract_policy_from_config(config)

то всё нормально сохраняется
О! Спасибо за исследование. И касается эта граблина именно словарей, что характерно. Потому что сиквенсы нормально отрабатываются.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version