From 4924bcf0e4f46f61ac806a90192393f915d0f8f9 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Thu, 24 Apr 2025 15:16:07 +0100 Subject: gh-89157: Make C and Python implementation of `datetime.date.fromisoformat` consistent (#131007) --- Lib/_pydatetime.py | 6 +++++- Lib/test/datetimetester.py | 3 ++- .../next/Library/2025-03-09-10-37-00.gh-issue-89157.qg3r138.rst | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-03-09-10-37-00.gh-issue-89157.qg3r138.rst diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index 50e21a1..e3db1b5 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -1050,8 +1050,12 @@ class date: @classmethod def fromisoformat(cls, date_string): """Construct a date from a string in ISO 8601 format.""" + if not isinstance(date_string, str): - raise TypeError('fromisoformat: argument must be str') + raise TypeError('Argument must be a str') + + if not date_string.isascii(): + raise ValueError('Argument must be an ASCII str') if len(date_string) not in (7, 8, 10): raise ValueError(f'Invalid isoformat string: {date_string!r}') diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index ecb3725..55844ec 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2087,6 +2087,7 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase): '10000-W25-1', # Invalid year '2020-W25-0', # Invalid day-of-week '2020-W25-8', # Invalid day-of-week + '٢025-03-09' # Unicode characters '2009\ud80002\ud80028', # Separators are surrogate codepoints ] @@ -3542,7 +3543,7 @@ class TestDateTime(TestDate): '2009-04-19T03:15:4500:00', # Bad time zone separator '2009-04-19T03:15:45.123456+24:30', # Invalid time zone offset '2009-04-19T03:15:45.123456-24:30', # Invalid negative offset - '2009-04-10ᛇᛇᛇᛇᛇ12:15', # Too many unicode separators + '2009-04-10ᛇᛇᛇᛇᛇ12:15', # Unicode chars '2009-04\ud80010T12:15', # Surrogate char in date '2009-04-10T12\ud80015', # Surrogate char in time '2009-04-19T1', # Incomplete hours diff --git a/Misc/NEWS.d/next/Library/2025-03-09-10-37-00.gh-issue-89157.qg3r138.rst b/Misc/NEWS.d/next/Library/2025-03-09-10-37-00.gh-issue-89157.qg3r138.rst new file mode 100644 index 0000000..0031721 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-03-09-10-37-00.gh-issue-89157.qg3r138.rst @@ -0,0 +1,2 @@ +Make the pure Python implementation of :func:`datetime.date.fromisoformat`, +only accept ASCII strings for consistency with the C implementation. -- cgit v0.12