我注意到一些我不明白的东西,我想知道是否有人可以阐明它。
简而言之:如果
x = datetime.datetime.utcnow
和
y = lambda: datetime.datetime.utcnow()
我希望x()并且y()总是表现得一样。然而,当 freezegun 参与时显然不是这种情况 - 它冻结y但没有x,我想知道为什么。(无论如何,如果x并且y在 freezegun 上下文之外定义,这是真的;在这样的上下文中,它们的行为似乎相同。)
例子:
from datetime import datetime
import freezegun
# I'd expect these two to behave the same, always.
x = datetime.utcnow
y = 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.508590
Time from y: 2019-01-02 03:04:05
Time 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 time
import freezegun
r = time.time
s = 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.2612312
Time from r: 1546398245.0
Time from s: 1546398245.0
游戏中的版本
$ python --version
Python 3.7.3
$ pip list | grep freezegun
freezegun 0.3.12
牛魔王的故事
相关分类