gh-89157: Make C and Python implementation of datetime.date.fromisoformat consistent (#131007)

This commit is contained in:
Stan Ulbrych 2025-04-24 15:16:07 +01:00 committed by GitHub
parent 92985e321a
commit 4924bcf0e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 9 additions and 2 deletions

View file

@ -1050,8 +1050,12 @@ class date:
@classmethod @classmethod
def fromisoformat(cls, date_string): def fromisoformat(cls, date_string):
"""Construct a date from a string in ISO 8601 format.""" """Construct a date from a string in ISO 8601 format."""
if not isinstance(date_string, str): 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): if len(date_string) not in (7, 8, 10):
raise ValueError(f'Invalid isoformat string: {date_string!r}') raise ValueError(f'Invalid isoformat string: {date_string!r}')

View file

@ -2087,6 +2087,7 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
'10000-W25-1', # Invalid year '10000-W25-1', # Invalid year
'2020-W25-0', # Invalid day-of-week '2020-W25-0', # Invalid day-of-week
'2020-W25-8', # Invalid day-of-week '2020-W25-8', # Invalid day-of-week
'٢025-03-09' # Unicode characters
'2009\ud80002\ud80028', # Separators are surrogate codepoints '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: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 time zone offset
'2009-04-19T03:15:45.123456-24:30', # Invalid negative 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\ud80010T12:15', # Surrogate char in date
'2009-04-10T12\ud80015', # Surrogate char in time '2009-04-10T12\ud80015', # Surrogate char in time
'2009-04-19T1', # Incomplete hours '2009-04-19T1', # Incomplete hours

View file

@ -0,0 +1,2 @@
Make the pure Python implementation of :func:`datetime.date.fromisoformat`,
only accept ASCII strings for consistency with the C implementation.