Pickle some parts of object

ใน Python มีกระบวนการอย่างหนึ่งเรียกว่า pickle ซึ่งใช้ในการแปลงข้อมูลจาก object ไปเป็นข้อความเพื่อนำไปเก็บหรือส่งข้อความนั้นข้ามระบบแล้วแปลงข้อมูลจากข้อความกลับมาเป็น object ใหม่

>>> a = {'k1':'v1', 'k2':'v2', 'k3':[1,5,3,4]}
>>> import pickle
>>> s = pickle.dumps(a)
>>> s
"(dp0\nS'k3'\np1\n(lp2\nI1\naI5\naI3\naI4\nasS'k2'\np3\nS'v2'\np4\nsS'k1'\np5\nS'v1'\np6\ns."
>>> b = pickle.loads(s)
>>> b
{'k3': [1, 5, 3, 4], 'k2': 'v2', 'k1': 'v1'}

แล้วเกิดสมมติว่าเรามี object แบบนี้

class kls:
    def __init__(self):
        self.hello = ''
        self.b = 'b'
        self.c = 'this is c'
        self._d = 'this is d' 

โดยที่เราไม่อยากให้ pickle เอา d ไปด้วย วิธีง่ายๆคือให้ override __getstate__ เท่านั้นเอง

def __getstate__(self):
    odict = self.__dict__.copy()  # Copy because we want to modify the clone, not the source
    del odict['_d']
    return odict

ส่วนเวลาเอากลับมาก็ override __setstate__

def __setstate__(self, dict):
    self.__dict__.update(dict)   # update attributes
    self._d = 'this is d'

ซึ่งในขั้นนี้ เราอาจจะทำการคำนวณค่าต่างๆเช่น _d กลับมาอีกรอบก็ได้ สำหรับรายละเอียด สามารถอ่านได้จากเอกสารเกี่ยวกับ Pickle

Comments

January 12, 2010 - 18:53
#1438

ยังไม่ค่อยเข้าใจเท่าไหร่ว่ามีกรณีไหนบ้างที่ไม่อยากให้ d ติดไปด้วยอ่ะครับ ?

wiennat
January 12, 2010 - 21:30
#1439

พวก property ที่เป็น derive value ไง หรือว่าพวกที่เป็น cache ทั้งหลาย เพราะที่ทำนี่คือจะได้ประหยัด ๆ ทั้งข้อมูลที่เก็บใน session ทั้งใน db อะ

พอจะเห็นภาพใช่ป่าว

January 13, 2010 - 00:04
#1440

นึกออกแล้วครับ เหมือนเวลาเก็บวันเกิดแต่ไม่อยากเก็บอายุใช่ม๊าา (ผมเป็นเด็กเข้าใจง่าย) :D

February 6, 2010 - 17:24
#1445

เข้าใจว่าเหมือน serialize กับ unserialize ใน PHP

Post new comment

The content of this field is kept private and will not be shown publicly.