python
type_error
ai_generated
true
TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
ID: python/pytest-freezegun-datetime-conflict
80%Fix Rate
82%Confidence
0Evidence
2024-08-30First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| 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
-
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) ... -
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:
-
70% fail
Import order in tests does not control the order inside application code imported at collection time.
-
80% fail
Fails for the same reason: the C extension holds a direct reference to the built-in type.