Python 泡菜方法 __getnewargs__ 无效
Python pickle method __getnewargs__ not working
我的想法是扩展 datetime
class,所以我可以用简单的 Day('20150208')
创建对象
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)
问题是无法正确序列化此对象:
print(loads(dumps(day)))
给出:
TypeError: strptime() argument 1 must be str not bytes
同样有趣的是__getnewargs__
里面的print
语句没有被调用,所以好像__getnewargs__
itsef没有被调用。
如何解决?
我也用 __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)))
我的想法是扩展 datetime
class,所以我可以用简单的 Day('20150208')
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)
问题是无法正确序列化此对象:
print(loads(dumps(day)))
给出:
TypeError: strptime() argument 1 must be str not bytes
同样有趣的是__getnewargs__
里面的print
语句没有被调用,所以好像__getnewargs__
itsef没有被调用。
如何解决?
我也用 __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)))