簡體   English   中英

Python 泡菜方法 __getnewargs__ 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM