[英]Python pickle method __getnewargs__ not working
這個想法是擴展datetime
時間 class,所以我可以用簡單Day('20150208')
創建 object
from datetime import datetime
from pickle import dumps, loads
class Day(datetime):
def __new__(cls, date):
day = datetime.strptime(date, '%Y%m%d')
return super().__new__(cls, day.year, day.month, day.day)
def __str__(self):
return datetime.strftime(self, '%Y%m%d')
def __getnewargs__(self):
print('__getnewargs__ called')
return (self.__str__(), )
day = Day('20200506')
print(day)
問題是這個 object 不能正確序列化:
print(loads(dumps(day)))
給出:
TypeError: strptime() argument 1 must be str not bytes
有趣的是, __getnewargs__
內部的print
語句沒有被調用,所以似乎__getnewargs__
itef 沒有被調用。
如何解決這個問題?
我也嘗試過__reduce__
,但沒有奏效。
datetime
實現__reduce__
和__reduce_ex__
。 這取代__getnewsarg__
。 你必須覆蓋__reduce_ex__
:
from datetime import datetime
from pickle import dumps, loads
class Day(datetime):
def __new__(cls, date):
day = datetime.strptime(date, '%Y%m%d')
return super().__new__(cls, day.year, day.month, day.day)
def __str__(self):
return datetime.strftime(self, '%Y%m%d')
def __reduce_ex__(self, prot):
return (self.__class__, (self.__str__(),))
day = Day('20200506')
print(day)
print(loads(dumps(day)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.