2017-03-09 92 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

回答

相关问题