python type_error ai_generated true

TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

ID: python/pytest-freezegun-datetime-conflict

Also available as: JSON · Markdown · 中文
80%Fix Rate
82%Confidence
0Evidence
2024-08-30First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
1.5.x active

Root Cause

freezegun tried to patch datetime.datetime but a C-extension module (e.g. pandas, psycopg2) imported datetime earlier and holds a C-level reference that cannot be monkeypatched.

generic

中文

freezegun 尝试 patch datetime.datetime,但某个 C 扩展模块(如 pandas、psycopg2)更早导入了 datetime 并持有 C 层引用,无法被 monkeypatch。

Workarounds

  1. 90% success
    from unittest.mock import patch
    import mypkg.service
    
    @patch('mypkg.service.datetime')
    def test_now(mock_dt):
        mock_dt.utcnow.return_value = datetime(2024, 1, 1)
        ...
  2. 95% success
    # service takes a clock=datetime.utcnow parameter
    def test_now():
        svc = Service(clock=lambda: datetime(2024, 1, 1))
        assert svc.today() == date(2024, 1, 1)

Dead Ends

Common approaches that don't work:

  1. 70% fail

    Import order in tests does not control the order inside application code imported at collection time.

  2. 80% fail

    Fails for the same reason: the C extension holds a direct reference to the built-in type.