我们写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