1 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
所以我猜這確實(shí)與 utcnow() 是一個(gè)綁定類方法有關(guān)——但我不知道是什么。
看起來你的直覺是正確的。Freezegun 不會(huì)修補(bǔ)datetime類的單個(gè)方法 - 相反,它會(huì)用自己的類完全替換FakeDatetime該類。
通過做作業(yè):
x = datetime.utcnow
x 存儲(chǔ)對(duì)原始utcnow()方法的引用,即使在freezegun.freeze_time()上下文管理器中也保持不變。
另一方面,lambda: datetime.utcnow()調(diào)用當(dāng)前上下文中可用的類utcnow(),并由.datetimeFakeDatetimefreezegun.freeze_time()
time.time()由freezegunfake_time()修補(bǔ)。Freezegun 甚至搜索已加載的模塊并修補(bǔ)存儲(chǔ)對(duì) 的引用的變量time.time(),但它僅限于模塊變量,因此它不會(huì)檢查內(nèi)部列表:
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
獎(jiǎng)勵(lì):如果 freezegun 如此細(xì)致地查找time.time()存儲(chǔ)在模塊變量中的引用,為什么它不修補(bǔ)time.time()內(nèi)部使用的datetime.utcnow()?
在搜索sys.modules它時(shí)故意省略 datetime和模塊不覆蓋源函數(shù),并且作為在模塊中導(dǎo)入time的副作用保持不修補(bǔ)。time.timedatetime
添加回答
舉報(bào)