我們寫datetime.datetime和datetime.date的覆蓋的情況下(見下文)如何覆蓋datetime.datetime,並保持它datetime.date
TEST_TIME_DELTA = datetime.timedelta(seconds=0)
class TimeTravelDateTime(datetime.datetime):
@classmethod
def now(cls,*args, **kwargs):
return super(TimeTravelDateTime,cls).now(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
@classmethod
def utcnow(cls, *args, **kwargs):
return super(TimeTravelDateTime, cls).utcnow(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
@classmethod
def today(cls, *args, **kwargs):
return super(TimeTravelDateTime, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
class TimeTravelDate(datetime.date):
@classmethod
def today(cls, *args, **kwargs):
return super(TimeTravelDate, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]
然後我們做了以下
sys.modules['datetime'].datetime = TimeTravelDateTime
sys.modules['datetime'].date = TimeTravelDate
但現在我們的代碼,因爲在relativedelta代碼失敗每次我們嘗試將relativedelta添加到我們的datetime.datetimes添加方法,有一個檢查:
if not isinstance(other, datetime.date):
raise TypeError("unsupported type for add operation")
其他是datetime.datetime.today()。 默認情況下,datetime.datetime是datetime.date的一個實例。另外,如果我們只有覆蓋datetime.datetime,那麼datetime.datetime.today()是仍然是 datetime.date的一個實例。即使類型(datetime.datetime.today())= datetime.datetime
但是,由於我們覆蓋datetime.date,isinstance檢查不再通過。
這有效,如果我們只覆蓋datetime.datetime,但只要我們覆蓋datetime.date,一切都會到地獄。
如何覆蓋datetime.date以便datetime.datetime仍然是datetime.date的實例。即。保持從這裏的子類關係https://docs.python.org/2/library/datetime.html#available-types(向下滾動一點點)。
爲什麼不能覆蓋的檢查呢? –
檢查是在相對timedelta這是基本代碼,並在很多地方使用,我們只是使用freezegun包,而不是使用該https://github.com/spulec/freezegun重構我們的測試 – amchugh89