2017-03-09 90 views
0

我們寫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(向下滾動一點點)。

+0

爲什麼不能覆蓋的檢查呢? –

+0

檢查是在相對timedelta這是基本代碼,並在很多地方使用,我們只是使用freezegun包,而不是使用該https://github.com/spulec/freezegun重構我們的測試 – amchugh89

回答

相關問題