1 回答
TA贡献1830条经验 获得超3个赞
所以我猜这确实与 utcnow() 是一个绑定类方法有关——但我不知道是什么。
看起来你的直觉是正确的。Freezegun 不会修补datetime类的单个方法 - 相反,它会用自己的类完全替换FakeDatetime该类。
通过做作业:
x = datetime.utcnow
x 存储对原始utcnow()方法的引用,即使在freezegun.freeze_time()上下文管理器中也保持不变。
另一方面,lambda: datetime.utcnow()调用当前上下文中可用的类utcnow(),并由.datetimeFakeDatetimefreezegun.freeze_time()
time.time()由freezegunfake_time()修补。Freezegun 甚至搜索已加载的模块并修补存储对 的引用的变量time.time(),但它仅限于模块变量,因此它不会检查内部列表:
import time
import freezegun
r = [time.time]
with freezegun.freeze_time('2019-01-02 03:04:05'):
print('Time inside freezegun:', time.time())
time_inside_list = r[0]
print('Time from list:', time_inside_list())
输出:
Time inside freezegun: 1546398245.0
Time from list: 1571669871.8807676
奖励:如果 freezegun 如此细致地查找time.time()存储在模块变量中的引用,为什么它不修补time.time()内部使用的datetime.utcnow()?
在搜索sys.modules它时故意省略 datetime和模块不覆盖源函数,并且作为在模块中导入time的副作用保持不修补。time.timedatetime
添加回答
举报