กำลังพยายามจำลอง datetime.date.today () แต่ไม่ทำงาน


158

มีใครบอกฉันได้ไหมว่าทำไมสิ่งนี้ถึงไม่ทำงาน

>>> import mock
>>> @mock.patch('datetime.date.today')
... def today(cls):
...  return date(2010, 1, 1)
...
>>> from datetime import date
>>> date.today()
datetime.date(2010, 12, 19)

บางทีบางคนอาจแนะนำวิธีที่ดีกว่า


1
เอกสารของmockห้องสมุด: voidspace.org.uk/python/mam/examples.html#partial-mocking
guettli

คำตอบ:


124

มีปัญหาเล็กน้อย

ก่อนอื่นวิธีที่คุณใช้mock.patchไม่ถูกต้อง เมื่อใช้เป็นมัณฑนากรจะแทนที่ได้รับฟังก์ชั่น / คลาส (ในกรณีนี้datetime.date.today) โดยมีMockวัตถุเฉพาะภายในฟังก์ชั่นการตกแต่ง ดังนั้นเฉพาะภายในคุณเท่านั้นที่today()จะdatetime.date.todayมีฟังก์ชั่นที่แตกต่างกันซึ่งไม่ปรากฏว่าเป็นสิ่งที่คุณต้องการ

สิ่งที่คุณต้องการดูเหมือนจะเป็นแบบนี้มากขึ้น:

@mock.patch('datetime.date.today')
def test():
    datetime.date.today.return_value = date(2010, 1, 1)
    print datetime.date.today()

น่าเสียดายที่วิธีนี้ใช้ไม่ได้:

>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
  File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
TypeError: can't set attributes of built-in/extension type 'datetime.date'

สิ่งนี้ล้มเหลวเนื่องจากชนิดในตัวของ Python ไม่เปลี่ยนรูป - ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม

ในกรณีนี้ฉันจะ subclass datetime.date ตัวเองและสร้างฟังก์ชั่นที่เหมาะสม:

import datetime
class NewDate(datetime.date):
    @classmethod
    def today(cls):
        return cls(2010, 1, 1)
datetime.date = NewDate

และตอนนี้คุณสามารถทำได้:

>>> datetime.date.today()
NewDate(2010, 1, 1)

13
ทางออกที่ดี แต่น่าเสียดายที่ทำให้เกิดปัญหากับการดอง
Baczek

14
ในขณะที่คำตอบนี้เป็นสิ่งที่ดีมันเป็นไปได้ที่จะเยาะเย้ย datetime โดยไม่ต้องสร้างชั้นเรียน: stackoverflow.com/a/25652721/117268
Emil Stenström

คุณจะคืนค่าdatetimeอินสแตนซ์กลับไปเป็นค่าดั้งเดิมได้อย่างไร กับdeepcoppy?
Oleg Belousov

5
ง่ายกว่ามากที่จะทำ:patch('mymodule.datetime', Mock(today=lambda: date(2017, 11, 29)))
Victor Gavro

1
@patch('module_you_want_to_test.date', Mock( today=Mock(return_value=datetime.date(2017, 11, 29))))เพิ่มเติมเรื่องง่ายที่จะทำ
Jonhy Beebop

163

ตัวเลือกอื่นคือใช้ https://github.com/spulec/freezegun/

ติดตั้ง:

pip install freezegun

และใช้มัน:

from freezegun import freeze_time

@freeze_time("2012-01-01")
def test_something():

    from datetime import datetime
    print(datetime.now()) #  2012-01-01 00:00:00

    from datetime import date
    print(date.today()) #  2012-01-01

นอกจากนี้ยังมีผลต่อการเรียกใช้วันที่และเวลาอื่น ๆ ในวิธีการโทรจากโมดูลอื่น ๆ :

other_module.py:

from datetime import datetime

def other_method():
    print(datetime.now())    

main.py:

from freezegun import freeze_time

@freeze_time("2012-01-01")
def test_something():

    import other_module
    other_module.other_method()

และในที่สุดก็:

$ python main.py
# 2012-01-01

13
ห้องสมุดที่มีประโยชน์มาก ๆ
Shaun

3
คุณอาจลองpython-libfaketimeหากคุณสังเกตว่าการทดสอบ freezegun ของคุณทำงานช้า
Simon Weber

ห้องสมุดที่ยอดเยี่ยม แต่น่าเสียดายที่เล่นได้ไม่ดีกับ Google App Engine NDB / Datastore
brandones

ฉันชอบที่ "freezegun" เป็นชื่อของห้องสมุด ฉันรัก Python devs จริงๆ! :-D
MikeyE

ใช้งานได้ แต่ freezegun ดูเหมือนจะช้าโดยเฉพาะถ้าคุณมีตรรกะที่ซับซ้อนด้วยการโทรหลายสายสำหรับเวลาปัจจุบัน
Andrey Belyak

115

สำหรับสิ่งที่คุ้มค่า Mock docs พูดถึง datetime.date.today โดยเฉพาะและเป็นไปได้ที่จะทำสิ่งนี้โดยไม่ต้องสร้างคลาสจำลอง

https://docs.python.org/3/library/unittest.mock-examples.html#partial-mocking

>>> from datetime import date
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
...
...     assert mymodule.date.today() == date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == date(2009, 6, 8)
...

2
มันไม่ได้ผลสำหรับฉันจริงๆ แม้ว่าฉันจะชื่นชมความพยายามในการค้นหารายการ
Pradyot

8
"mymodule" ในฟังก์ชั่นแก้ไขคืออะไร
seufagner

4
พบลิงค์ที่นี่ภายใต้ "การเยาะเย้ยบางส่วน"
Leo C Han

3
@seufagner MyModule จะมีการอธิบายในแฟชั่นค่อนข้างสับสนในตอนvoidspace.org.uk/python/mock/patch.html#where-to-patch ดูเหมือนว่าหากโมดูลของคุณใช้from datetime import dateแล้วมันเป็นชื่อของโมดูลที่from datetime import dateและการเรียกร้องที่จะdate.today()ปรากฏขึ้น
danio

1
ขอบคุณ ทำงาน! ตัวอย่าง: ด้วย mock.patch ('tests.views.datetime') เป็น mock_date: mock_date.today.return_value = datetime.datetime (2016, 9, 18) mock_date.side_effect = lambda * args, ** กิโลวัตต์: วันที่ (* args , ** kw)
Latrova

36

ฉันคิดว่าฉันมาสายเล็กน้อยสำหรับเรื่องนี้ แต่ฉันคิดว่าปัญหาหลักของที่นี่คือคุณกำลังแก้ไข datetime.date.today โดยตรงและตามเอกสารอธิบายสิ่งนี้ผิด

คุณควรแก้ไขข้อมูลอ้างอิงที่นำเข้ามาในไฟล์โดยใช้ฟังก์ชันที่ทดสอบ

สมมติว่าคุณมีไฟล์ function.py ที่คุณมีต่อไปนี้:

import datetime

def get_today():
    return datetime.date.today()

จากนั้นในการทดสอบของคุณคุณควรมีสิ่งนี้

import datetime
import unittest

from functions import get_today
from mock import patch, Mock

class GetTodayTest(unittest.TestCase):

    @patch('functions.datetime')
    def test_get_today(self, datetime_mock):
        datetime_mock.date.today = Mock(return_value=datetime.strptime('Jun 1 2005', '%b %d %Y'))
        value = get_today()
        # then assert your thing...

หวังว่านี่จะช่วยได้เล็กน้อย


สิ่งนี้ดูน่าสนใจมาก แต่ฉันไม่สามารถเรียกใช้สิ่งนี้ได้ (พ่นNameError: name 'datetime' is not defined) การdatetime.strptimeอ้างอิงMock(return_value=...)มาจากที่ใดหากคุณไม่ได้นำเข้าdatetimeไฟล์ทดสอบของคุณ UPDATE: ไม่เป็นไรฉันเพิ่งไปข้างหน้าและนำเข้าdatetimeโมดูลในไฟล์ทดสอบ ฉันคิดว่าเคล็ดลับคือวิธีที่คุณซ่อนการdatetimeอ้างอิงจากไฟล์ทดสอบ
imrek

@DunkunkMaster ฉันต้องดูตัวอย่างของสิ่งที่คุณกำลังทำอยู่และการอ้างอิงใดที่คุณกำลังเยาะเย้ย คุณกำลังทำimport datetimeหรือfrom datetime import strptime? หากคุณกำลังทำสิ่งแรกคุณจะต้องเยาะเย้ยdatetimeและทำสิ่งmocked_datetime.strptime.return_value = whateverนั้นเป็นสิ่งที่ใหม่กว่าคุณต้องจำลองการอ้างอิงสเตรปไทม์โดยตรงในไฟล์ที่วิธีการทดสอบมีชีวิตอยู่
iferminm

@israelord สิ่งที่ฉันหมายถึงคือโค้ดขนาดสั้นของคุณ (ไฟล์ทดสอบ) ไม่มีการนำเข้าสำหรับการอ้างอิง datetime เพื่อให้Mock(return_value=datetime...)ทำงานได้
imrek

32

วิธีเพิ่มโซลูชันของ Daniel G :

from datetime import date

class FakeDate(date):
    "A manipulable date replacement"
    def __new__(cls, *args, **kwargs):
        return date.__new__(date, *args, **kwargs)

สิ่งนี้จะสร้างคลาสที่เมื่ออินสแตนซ์จะส่งคืนออบเจกต์ datetime.date ปกติ แต่ยังสามารถเปลี่ยนได้

@mock.patch('datetime.date', FakeDate)
def test():
    from datetime import date
    FakeDate.today = classmethod(lambda cls: date(2010, 1, 1))
    return date.today()

test() # datetime.date(2010, 1, 1)

2
ระวังให้มากที่นี่ - คุณต้องใช้จากเวอร์ชันมิฉะนั้นคุณอาจได้รับความแปลกถ้าคุณใช้ datetime.date (หรือวันที่หรือเวลาหรืออื่น ๆ ) IE - เข้าถึงความลึกของสแต็คเมื่อมีสายปลอมใหม่
Danny Staple

คุณจะไม่ได้มีปัญหาว่าถ้าวัตถุปลอมที่อยู่ในโมดูลของตัวเอง: dpaste.com/790309 แม้ว่าแม้ว่าจะอยู่ในโมดูลเดียวกันกับฟังก์ชั่นที่เยาะเย้ย แต่ก็ไม่ได้นำเข้าdate/ datetimeตัวมันเองก็ใช้ตัวแปรที่มีอยู่ทั่วโลกดังนั้นจึงไม่มีปัญหา: dpaste.com/790310
eternicode

คำอธิบายสั้น ๆ น้อย ๆ สามารถพบได้ที่นี่: williamjohnbert.com/2011/07/…
ezdazuzena

9

ฉันเผชิญกับสถานการณ์เดียวกันเมื่อสองสามวันก่อนและโซลูชันของฉันคือการกำหนดฟังก์ชั่นในโมดูลเพื่อทดสอบและเพียงแค่ล้อเลียนว่า:

def get_date_now():
    return datetime.datetime.now()

วันนี้ฉันค้นพบFreezeGunและดูเหมือนว่าจะครอบคลุมกรณีนี้อย่างสวยงาม

from freezegun import freeze_time
import datetime
import unittest


@freeze_time("2012-01-14")
def test():
    assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)

9

วิธีที่ง่ายที่สุดสำหรับฉันคือทำสิ่งนี้:

import datetime
from unittest.mock import Mock, patch

def test():
    datetime_mock = Mock(wraps=datetime.datetime)
    datetime_mock.now.return_value = datetime.datetime(1999, 1, 1)
    with patch('datetime.datetime', new=datetime_mock):
        assert datetime.datetime.now() == datetime.datetime(1999, 1, 1)

ข้อควรระวังสำหรับโซลูชันนี้: การทำงานทั้งหมดdatetime moduleจากtarget_moduleจะหยุดทำงาน


1
มันดีและกระชับจริงๆ เส้นdatetime_mock.now = Mock(return_value=datetime(1999, 1, 1)อาจสั้นลงdatetime_mock.now.return_value = datetime(1999, 1, 1)ได้ แทนที่จะเริ่มใช้ปะแก้start()ให้ลองใช้ตัวwith patch(...):จัดการบริบทเพื่อให้แน่ใจว่าdatetimeจะทำงานเป็นปกติ
Dirk

ชอบวิธีการแก้ปัญหาที่ใช้ห้องสมุดในตัวเสมอ
Nam G VU

@ frx08 ฉันขอทราบวิธีรีเซ็ตการเยาะเย้ยนี้ได้ไหม ฉันหมายถึงวิธีdatetime.datetime.now()ปลดล็อคออก ^^?
Nam G VU

หลังจากลองใช้จำลองนี้ - ข้อควรระวังหนึ่งข้อสำหรับโซลูชันนี้คือการทำงานทั้งหมดdatetime moduleจากtarget_moduleจะหยุดทำงาน
Nam G VU

1
เห็นด้วย @ frx08 กับ () จะทำให้เจ็บปวดอย่างอ่อนโยน แม้ว่าภายในบล็อกนั้นทั้งหมดเช่นวันที่ timedelta จะหยุดทำงาน เกิดอะไรขึ้นถ้าเราต้องการเยาะเย้ยในขณะนี้ แต่คณิตศาสตร์วันที่ยังคงไป ขออภัยเราต้องมี. now () เยาะเย้ยเท่านั้นไม่ใช่โมดูล datetime ทั้งหมด
Nam G VU

7

คุณสามารถใช้วิธีการต่อไปนี้โดยยึดตามโซลูชัน Daniel G isinstance(d, datetime.date)หนึ่งนี้มีประโยชน์จากการไม่ทำลายการตรวจสอบชนิดด้วย

import mock

def fixed_today(today):
    from datetime import date

    class FakeDateType(type):
        def __instancecheck__(self, instance):
            return isinstance(instance, date)

    class FakeDate(date):
        __metaclass__ = FakeDateType

        def __new__(cls, *args, **kwargs):
            return date.__new__(date, *args, **kwargs)

        @staticmethod
        def today():
            return today

    return mock.patch("datetime.date", FakeDate)

โดยทั่วไปเราแทนที่ C-ตามdatetime.dateชั้นเรียนกับประเภทรองหลามของเราเองที่ผลิตเดิมdatetime.dateกรณีและตอบสนองต่อคำสั่งตรงตามพื้นเมืองisinstance()datetime.date

ใช้เป็นผู้จัดการบริบทในการทดสอบของคุณ:

with fixed_today(datetime.date(2013, 11, 22)):
    # run the code under test
    # note, that these type checks will not break when patch is active:
    assert isinstance(datetime.date.today(), datetime.date)

วิธีการที่คล้ายกันสามารถใช้ในการจำลองdatetime.datetime.now()ฟังก์ชั่น


ฉันไม่แน่ใจว่าใช้งานได้ใน Python 2.7 ฉันได้รับ RuntimeError เชิงลึกแบบเรียกซ้ำสูงสุดด้วย__instancecheck__วิธีการ
Dan Loewenherz

ใช้งานได้จริงใน Python 2.7 และแก้ไขปัญหาของฉันด้วยการตรวจสอบประเภทอินสแตนซ์ขอบคุณ!
Karatheodory

4

โดยทั่วไปคุณจะมีdatetimeหรืออาจจะdatetime.dateนำเข้ามาในบางโมดูล วิธีที่มีประสิทธิภาพมากขึ้นในการเย้ยหยันวิธีนี้คือการแก้ไขบนโมดูลที่กำลังนำเข้า ตัวอย่าง:

a.py

from datetime import date

def my_method():
    return date.today()

จากนั้นสำหรับการทดสอบของคุณวัตถุจำลองจะถูกส่งผ่านเป็นอาร์กิวเมนต์สำหรับวิธีการทดสอบ คุณจะตั้งค่าจำลองด้วยค่าผลลัพธ์ที่คุณต้องการแล้วเรียกวิธีการของคุณภายใต้การทดสอบ จากนั้นคุณจะยืนยันว่าวิธีการของคุณทำในสิ่งที่คุณต้องการ

>>> import mock
>>> import a
>>> @mock.patch('a.date')
... def test_my_method(date_mock):
...     date_mock.today.return_value = mock.sentinel.today
...     result = a.my_method()
...     print result
...     date_mock.today.assert_called_once_with()
...     assert mock.sentinel.today == result
...
>>> test_my_method()
sentinel.today

คำเตือน เป็นไปได้อย่างแน่นอนที่จะลงเรือด้วยการเยาะเย้ย เมื่อคุณทำมันจะทำให้การทดสอบของคุณนานขึ้นยากที่จะเข้าใจและเป็นไปไม่ได้ที่จะรักษา ก่อนที่คุณจะจำลองวิธีการง่ายๆdatetime.date.todayให้ถามตัวเองว่าคุณจำเป็นต้องจำลองหรือไม่ หากการทดสอบของคุณสั้นและตรงประเด็นและทำงานได้ดีโดยไม่มีการเยาะเย้ยฟังก์ชั่นคุณอาจมองไปที่รายละเอียดภายในของรหัสที่คุณกำลังทดสอบแทนที่จะเป็นวัตถุที่คุณต้องจำลอง


2

นี่เป็นอีกวิธีในการเยาะเย้ยdatetime.date.today()ด้วยโบนัสเพิ่มเติมที่ส่วนที่เหลือของdatetimeฟังก์ชั่นยังคงทำงานตามที่วัตถุจำลองถูกกำหนดค่าให้ห่อdatetimeโมดูลเดิม:

from unittest import mock, TestCase

import foo_module

class FooTest(TestCase):

    @mock.patch(f'{foo_module.__name__}.datetime', wraps=datetime)
    def test_something(self, mock_datetime):
        # mock only datetime.date.today()
        mock_datetime.date.today.return_value = datetime.date(2019, 3, 15)
        # other calls to datetime functions will be forwarded to original datetime

หมายเหตุwraps=datetimeอาร์กิวเมนต์ถึงmock.patch()- เมื่อการfoo_moduleใช้งานdatetimeฟังก์ชั่นอื่น ๆนอกเหนือจากdate.today()นั้นจะถูกส่งต่อไปยังdatetimeโมดูลห่อเดิม


1
คำตอบที่ดีการทดสอบส่วนใหญ่ที่คุณต้องจำลองวันที่คุณจะต้องใช้โมดูล datetime
Antoine Vo

1

การแก้ปัญหาหลายอย่างที่กล่าวไว้ในhttp://blog.xelnor.net/python-mocking-datetime/ สรุป:

วัตถุจำลอง - ง่ายและมีประสิทธิภาพ แต่แบ่ง isinstance () ตรวจสอบ:

target = datetime.datetime(2009, 1, 1)
with mock.patch.object(datetime, 'datetime', mock.Mock(wraps=datetime.datetime)) as patched:
    patched.now.return_value = target
    print(datetime.datetime.now())

ชั้นเลียนแบบ

import datetime
import mock

real_datetime_class = datetime.datetime

def mock_datetime_now(target, dt):
    class DatetimeSubclassMeta(type):
        @classmethod
        def __instancecheck__(mcs, obj):
            return isinstance(obj, real_datetime_class)

    class BaseMockedDatetime(real_datetime_class):
        @classmethod
        def now(cls, tz=None):
            return target.replace(tzinfo=tz)

        @classmethod
        def utcnow(cls):
            return target

    # Python2 & Python3 compatible metaclass
    MockedDatetime = DatetimeSubclassMeta('datetime', (BaseMockedDatetime,), {})

    return mock.patch.object(dt, 'datetime', MockedDatetime)

ใช้เป็น:

with mock_datetime_now(target, datetime):
   ....

0

บางทีคุณอาจใช้วิธี "today ()" ของคุณเองที่คุณจะแก้ไขเมื่อจำเป็น ตัวอย่างที่มีการเยาะเย้ย utcnow () สามารถดูได้ที่นี่: https://bitbucket.org/k_bx/blog/src/tip/source/en_posts/2012-07-13-double-call-hack.rst?at=default



0

ฉันใช้วิธีการ @ user3016183 โดยใช้มัณฑนากรที่กำหนดเอง:

def changeNow(func, newNow = datetime(2015, 11, 23, 12, 00, 00)):
    """decorator used to change datetime.datetime.now() in the tested function."""
    def retfunc(self):                             
        with mock.patch('mymodule.datetime') as mock_date:                         
            mock_date.now.return_value = newNow
            mock_date.side_effect = lambda *args, **kw: datetime(*args, **kw)
            func(self)
    return retfunc

ฉันคิดว่าอาจช่วยใครซักคนในหนึ่งวัน ...


0

เป็นไปได้ที่จะเลียนแบบฟังก์ชั่นจากdatetimeโมดูลโดยไม่ต้องเพิ่มside_effects

import mock
from datetime import datetime
from where_datetime_used import do

initial_date = datetime.strptime('2018-09-27', "%Y-%m-%d")
with mock.patch('where_datetime_used.datetime') as mocked_dt:
    mocked_dt.now.return_value = initial_date
    do()

0

สำหรับผู้ที่ใช้ pytest กับผู้เยาะเย้ยนี่คือวิธีที่ฉันเยาะเย้ยdatetime.datetime.now()ซึ่งคล้ายกับคำถามเริ่มแรก

test_get_now(mocker):
    datetime_mock = mocker.patch("blackline_accounts_import.datetime",)
    datetime_mock.datetime.now.return_value=datetime.datetime(2019,3,11,6,2,0,0)

    now == function_being_tested()  # run function

    assert now == datetime.datetime(2019,3,11,6,2,0,0)

โดยพื้นฐานแล้วการจำลองจะต้องตั้งค่าให้ส่งกลับวันที่ที่ระบุ คุณไม่สามารถแก้ไขวัตถุของ datetime ได้โดยตรง


0

ผมทำผลงานชิ้นนี้โดยการนำเข้าdatetimeเป็นrealdatetimeและการเปลี่ยนวิธีการที่ผมจำเป็นต้องมีในการเยาะเย้ยด้วยวิธีจริง:

import datetime as realdatetime

@mock.patch('datetime')
def test_method(self, mock_datetime):
    mock_datetime.today = realdatetime.today
    mock_datetime.now.return_value = realdatetime.datetime(2019, 8, 23, 14, 34, 8, 0)

0

คุณสามารถเยาะเย้ยdatetimeโดยใช้สิ่งนี้:

ในโมดูลsources.py:

import datetime


class ShowTime:
    def current_date():
        return datetime.date.today().strftime('%Y-%m-%d')

ในtests.py:

from unittest import TestCase, mock
import datetime


class TestShowTime(TestCase):
    def setUp(self) -> None:
        self.st = sources.ShowTime()
        super().setUp()

    @mock.patch('sources.datetime.date')
    def test_current_date(self, date_mock):
        date_mock.today.return_value = datetime.datetime(year=2019, month=10, day=1)
        current_date = self.st.current_date()
        self.assertEqual(current_date, '2019-10-01')

สิ่งที่อยู่sourcesในมัณฑนากรตกแต่งของคุณ?
elena

ถึง @elena มันค่อนข้างยากที่จะจำสิ่งที่ฉันคิดเกี่ยวกับเกือบหนึ่งปีที่ผ่านมา)) ฉันเดาว่าฉันหมายถึงโมดูลใด ๆ ของแหล่งที่มาแอพของเรา - เพียงรหัสของแอปพลิเคชันของคุณ
MTMobile

0

CPython จริงใช้โมดูล datetime โดยใช้ทั้งบริสุทธิ์หลามLib / datetime.pyและ C-เพิ่มประสิทธิภาพโมดูล / _datetimemodule.c เวอร์ชันที่ปรับให้เหมาะกับ C ไม่สามารถแก้ไขได้ แต่เวอร์ชัน Python บริสุทธิ์สามารถ

ที่ด้านล่างของการใช้งาน pure-Python ในLib / datetime.pyคือรหัสนี้:

try:
    from _datetime import *  # <-- Import from C-optimized module.
except ImportError:
    pass

รหัสนี้นำเข้าคำจำกัดความที่ปรับให้เหมาะสมทั้งหมดและแทนที่คำจำกัดความ pure-Python ทั้งหมดอย่างมีประสิทธิภาพ เราสามารถบังคับให้ CPython ใช้การใช้งาน Python แบบบริสุทธิ์ของโมดูล datetime โดยทำ:

import datetime
import importlib
import sys

sys.modules["_datetime"] = None
importlib.reload(datetime)

โดยการตั้งค่าsys.modules["_datetime"] = Noneเราบอก Python ให้ละเว้นโมดูล C-optimization จากนั้นเราโหลดโมดูลซึ่งทำให้การนำเข้า_datetimeล้มเหลว ตอนนี้คำจำกัดความ pure-Python ยังคงอยู่และสามารถแก้ไขได้ตามปกติ

หากคุณใช้Pytest ให้รวมข้อมูลโค้ดด้านบนในconftest.pyและคุณสามารถแก้ไขdatetimeวัตถุได้ตามปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.