python - 为什么在函数a中覆盖datetime.datetime会影响函数b的执行?
问题描述
我目前正在写一篇关于在 Python 中为单元测试打补丁的文章,我很困惑为什么以下工作有效。当我pytest
在该目录中执行时,尽管我的系统时间不是 1990 年,但测试成功了。
我认为datetime.datetime = NewDate
只会在test_example.py
. 我想我需要更好地了解 Python 将名称/指向导入模块的指针存储在何处。有人可以解释一下吗?
例子.py
# Core Library modules
import datetime
def generate_filename():
return f"{datetime.datetime.now():%Y-%m-%d}.png"
test_example.py
# Core Library modules
import datetime
from unittest import mock
# First party modules
from mock_example import generate_filename
class NewDate(datetime.datetime):
@classmethod
def now(cls):
return cls(1990, 4, 28)
def test_generate_filename():
datetime.datetime = NewDate
assert generate_filename() == "1990-04-28.png"
解决方案
在您导入 的行上from mock_example import generate_filename
,import datetime
被执行,因此 的值datetime.datetime
被覆盖,datetime.datetime = NewDate
因为它在导入后被执行。在同一程序上发生的对任何全局变量(包括导入)的所有修改都会影响程序中的任何地方,无论它们位于不同的文件中。
您实际上是在访问两个文件上的相同“变量”。如果您像这样导入它就不会发生这种情况(@Vishal Singh回答from datetime import datetime
中有关此的更多信息)