Latest posts on pickle и словари в подобъектах класса topichttp://python.su/forum/topic/446/2007-02-13T11:37:21+02:00Общий :: Python для экспертов :: pickle и словари в подобъектах класса
2007-02-13T11:37:21+02:00denz3049<blockquote><em>Striver</em><br/>Насколько я понял, проблема в том, что все данные-члены - статические. Видимо, pickle их как-то не так сохраняет. <br/>Если усугубить ситуацию и удалить из файла test1.py строку s.policy=RRDPolicy() (вначале я не понял, зачем в класс s член policy два раза добавляется, теперь догадываюсь…), то policy тоже будет статическим и результат test2 станет вообще пустым.<br/>Если из определения класса строчки<br/> ds = {}<br/> dsnames =<br/> rra = <br/>перенести в конструктор:<br/><br/> def __init__(self,config=“none”):<br/> self.ds = {}<br/> self.dsnames =<br/> self.rra = <br/> if config<>“none”:<br/> self.extract_policy_from_config(config)<br/><br/>то всё нормально сохраняется</blockquote>О! Спасибо за исследование. И касается эта граблина именно словарей, что характерно. Потому что сиквенсы нормально отрабатываются.
Общий :: Python для экспертов :: pickle и словари в подобъектах класса
2007-02-13T05:54:56+02:00Striver3041Насколько я понял, проблема в том, что все данные-члены - статические. Видимо, pickle их как-то не так сохраняет. <br/>Если усугубить ситуацию и удалить из файла test1.py строку s.policy=RRDPolicy() (вначале я не понял, зачем в класс s член policy два раза добавляется, теперь догадываюсь…), то policy тоже будет статическим и результат test2 станет вообще пустым.<br/>Если из определения класса строчки<br/> ds = {}<br/> dsnames =<br/> rra = <br/>перенести в конструктор:<br/><br/> def __init__(self,config=“none”):<br/> self.ds = {}<br/> self.dsnames =<br/> self.rra = <br/> if config<>“none”:<br/> self.extract_policy_from_config(config)<br/><br/>то всё нормально сохраняется
Общий :: Python для экспертов :: pickle и словари в подобъектах класса
2007-02-12T17:34:25+02:00denz3033Такая странная грабля, извиняюсь за много кода, взято из реального исходника, на случай если у меня чегойто с глазами.<br/><br/>Есть класс:<br/>#RRDPolicy.py<br/>class RRDPolicy:<br/> ds = {}<br/> dsnames =<br/> rra = <br/> datasource_types=<br/> consolidations=<br/> step = 1<br/><br/><br/> def __init__(self,config=“none”):<br/> if config<>“none”:<br/> self.extract_policy_from_config(config)<br/> def setstep(self,step):<br/> if step>0:<br/> self.step=step<br/> <br/> def addDS(self, name, dst, heartbeat, min=“U”, max=“U”):<br/> #DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max<br/> if dst not in self.datasource_types:<br/> raise RRDPolicyError(“Data source type %s unknown!”%dst)<br/> self.dsnames+=name,<br/> self.ds=<br/><br/> def addRRA(self, consolidation, xff, rra_step_duration, lifetime):<br/> #RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows<br/> if consolidation not in self.consolidations:<br/> raise RRDPolicyError(“Consolidation %s unknown!”%consolidation)<br/> self.rra+=,<br/><br/>——————————————————————————————————–<br/>Записываем объект в файл<br/>#test1.py<br/>#!/usr/bin/env python<br/><br/>from RRDPolicy import RRDPolicy<br/>import cPickle as pickle<br/><br/><br/>class superClass:<br/> policy=RRDPolicy()<br/> <br/> def __init__(self):<br/> pass<br/><br/>if __name__==“__main__”:<br/> s=superClass()<br/> s.policy=RRDPolicy()<br/> s.policy.setstep(20)<br/> s.policy.addDS(“val1”,“GAUGE”,60,0,999999999999)<br/> s.policy.addRRA(“LAST”,0.5,60,3600*24*40)<br/> t=file(“temp.pkl”,“w”)<br/> pickle.dump(s,t)<br/> print s.policy.ds<br/> print s.policy.rra<br/> print s.policy.dsnames<br/> t.close()<br/>———————<br/>результат<br/>———————<br/>>{'val1': }<br/>>[]<br/>><br/><br/><br/>——————————————————————————————- <br/>считываем объект из файла:<br/>#test2.py<br/>#!/usr/bin/env python<br/><br/>from RRDPolicy import RRDPolicy<br/>import cPickle as pickle<br/><br/>class superClass:<br/> policy=RRDPolicy()<br/> <br/> def __init__(self):<br/> pass<br/><br/><br/>t=file(“temp.pkl”,“r”)<br/>s=pickle.load(t)<br/>print s.policy.ds<br/>print s.policy.rra<br/>print s.policy.dsnames<br/>t.close()<br/><br/>——————<br/>результат<br/>——————<br/><br/>>{}<br/>>[]<br/>><br/>———————-<br/><br/>Внимание вопрос: куды запропастились значения из словаря ds?<br/><br/>В описании pickle не обнаружил никаких ньюансов насчет словарей.<br/><br/>Ктонибудь видит грабли?<br/><br/>Заранее спасибо за любой ответ.