如何覆盖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

但是,我们的代码现在每次尝试在DateTime中添加一个Relativedelta。

if not isinstance(other, datetime.date):
    raise TypeError("unsupported type for add operation") 

其他是dateTime.dateTime.today()。默认情况下,dateTime.datetime是dateTime.date的实例。另外,如果我们 overwrite dateTime.dateTime,则dateTime.dateTime.today()为 still dateTime.date的实例。即使type(dateTime.dateTime.today())= dateTime.dateTime

但是,随着我们对dateTime的覆盖,iSinstance检查不再通过。

如果我们仅覆盖dateTime.datetime,那么这有效

我们如何覆盖dateTime.date,以便dateTime.datetime仍然是dateTime.date的实例。IE。从这里保持子类关系https://docs.python.org/2/library/datetime.html#available-types(向下滚动一个很小的位)。

我们只是使用freezegun软件包,然后用该https://github.com/spulec/freezegun

重新分配了我们的测试。

最新更新