亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 datetime.utcnow 的行為不像我對 freezegun 的預期那樣?

為什么 datetime.utcnow 的行為不像我對 freezegun 的預期那樣?

LEATH 2022-06-28 15:28:37
我注意到一些我不明白的東西,我想知道是否有人可以闡明它。簡而言之:如果x = datetime.datetime.utcnow和y = lambda: datetime.datetime.utcnow()我希望x()并且y()總是表現得一樣。然而,當 freezegun 參與時顯然不是這種情況 - 它凍結y但沒有x,我想知道為什么。(無論如何,如果x并且y在 freezegun 上下文之外定義,這是真的;在這樣的上下文中,它們的行為似乎相同。)例子:from datetime import datetimeimport freezegun# I'd expect these two to behave the same, always.x = datetime.utcnowy = lambda: datetime.utcnow()with freezegun.freeze_time('2019-01-02 03:04:05'):    # Here their behaviours diverge    print('Time from x:', x())    print('Time from y:', y())    # This behaves as I'd expect, however.    z = datetime.utcnow    print('Time from z:', z())))結果:Time from x: 2019-10-18 12:21:37.508590Time from y: 2019-01-02 03:04:05Time from z: 2019-01-02 03:04:05這Time from x是運行時的時間,即它不受 freezegun 的控制。任何人都可以對此有所了解嗎?這只是 freezegun 的一些奇怪之處,或者當我假設x并且y應該始終等價時,我是否誤解了關于 python 的更基本的東西?我看到這utcnow是一個綁定的類方法,但我不明白為什么這會暗示這種行為。后記:time.time不這樣做查看utcnow()'s source它基本上只是一個包裝器-time.time()但不要以這種方式發散...所以我猜這確實與綁定類方法有關-但我不知道是什么。time.timelambda: time.time() utcnow()import timeimport freezegunr = time.times = lambda: time.time()print('Time outside freezegun:', time.time())with freezegun.freeze_time('2019-01-02 03:04:05'):    print('Time from r:', r())    print('Time from s:', s())給出:Time outside freezegun: 1571401765.2612312Time from r: 1546398245.0Time from s: 1546398245.0游戲中的版本$ python --versionPython 3.7.3$ pip list | grep freezegunfreezegun               0.3.12
查看完整描述

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


查看完整回答
反對 回復 2022-06-28
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號