https://github.com/python/cpython/commit/ff781d52d451db56e154aac35ae7f2c41b1695a4
commit: ff781d52d451db56e154aac35ae7f2c41b1695a4
branch: main
author: tonghuaroot (童话) <[email protected]>
committer: StanFromIreland <[email protected]>
date: 2026-06-24T14:40:46+01:00
summary:
gh-152060: Fix `_pydatetime.fromisoformat()` raising `AssertionError` on
invalid lengths (#152061)
files:
A Misc/NEWS.d/next/Library/2026-06-24-10-46-35.gh-issue-152060.f2asrt.rst
M Lib/_pydatetime.py
M Lib/test/datetimetester.py
diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py
index c1448374402de4..db4ea8d30c7064 100644
--- a/Lib/_pydatetime.py
+++ b/Lib/_pydatetime.py
@@ -358,7 +358,8 @@ def _find_isoformat_datetime_separator(dtstr):
def _parse_isoformat_date(dtstr):
# It is assumed that this is an ASCII-only string of lengths 7, 8 or 10,
# see the comment on
Modules/_datetimemodule.c:_find_isoformat_datetime_separator
- assert len(dtstr) in (7, 8, 10)
+ if len(dtstr) not in (7, 8, 10):
+ raise ValueError("Invalid isoformat string")
year = int(dtstr[0:4])
has_sep = dtstr[4] == '-'
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index 1cbe78c1ecbfdc..e29f5e3ecb5fd4 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -3757,6 +3757,7 @@ def test_fromisoformat_fails_datetime(self):
'2009-04-19T12:30:45+00:00:90', # Time zone field out from range
'2009-04-19T12:30:45-00:90:00', # Time zone field out from range
'2009-04-19T12:30:45-00:00:90', # Time zone field out from range
+ '2020-2020', # Ambiguous 9-char date portion
]
for bad_str in bad_strs:
diff --git
a/Misc/NEWS.d/next/Library/2026-06-24-10-46-35.gh-issue-152060.f2asrt.rst
b/Misc/NEWS.d/next/Library/2026-06-24-10-46-35.gh-issue-152060.f2asrt.rst
new file mode 100644
index 00000000000000..6088a6b80829bb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-06-24-10-46-35.gh-issue-152060.f2asrt.rst
@@ -0,0 +1,3 @@
+Fix :meth:`datetime.datetime.fromisoformat` raising :exc:`AssertionError`
+instead of :exc:`ValueError` for some malformed strings in the pure-Python
+implementation, matching the C implementation.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]