首页 > 解决方案 > 为什么在函数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"

标签: pythonunit-testingscopepatch

解决方案


在您导入 的行上from mock_example import generate_filenameimport datetime被执行,因此 的值datetime.datetime被覆盖,datetime.datetime = NewDate因为它在导入后被执行。在同一程序上发生的对任何全局变量(包括导入)的所有修改都会影响程序中的任何地方,无论它们位于不同的文件中。

您实际上是在访问两个文件上的相同“变量”。如果您像这样导入它就不会发生这种情况(@Vishal Singh回答from datetime import datetime中有关此的更多信息)


推荐阅读