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
添加回答
舉報