C'è un modo per far sì che Python pickle ignori gli errori "non è lo stesso oggetto"?C'è un modo per fare in modo che Python pickle ignori errori "non è lo stesso oggetto"
Sto scrivendo un test utilizzando Mock per avere un controllo a grana fine sui risultati prodotti da datetime.utcnow(). Il codice che sto usando è time sensitive, quindi la patch di mock rende facile testare.
Gli stessi test devono decodificare gli oggetti e inviare i risultati a un server remoto. Ai fini del test se un datetime standard è stato decapitato e ricevuto dal server remoto, tutto andrebbe bene.
Purtroppo il modulo pickle è barfing con il seguente errore:
Can't pickle <type 'datetime.datetime'>: it's not the same object as datetime.datetime
Ecco un esempio minimo per riprodurre l'errore.
from mock import patch
from datetime import datetime
import pickle
class MockDatetime(datetime):
frozendt = datetime(2011,05,31)
@classmethod
def advance(cls, **kw):
cls.frozendt = cls.frozendt + timedelta(**kw)
@classmethod
def utcnow(cls):
return cls.frozendt
@patch('datetime.datetime', MockDatetime)
def test():
pickle.dumps(datetime.utcnow())
if __name__ == '__main__':
test()
C'è qualche combo di __reduce__
e __getstate__
metodi che potrebbero ingannare i macchinari salamoia a pensare MockDatetime è un datetime quando Pickle?