Skip to content

Commit b77759e

Browse files
author
marat
committed
Unify behavior of unsupported %-format specifiers
1 parent 0f7cd55 commit b77759e

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

Lib/_pydatetime.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,16 @@ def _wrap_strftime(object, format, timetuple):
284284
push('{:04}'.format(year))
285285
if ch == 'F':
286286
push('-{:02}-{:02}'.format(*timetuple[1:3]))
287+
elif ch == '-':
288+
if i < n:
289+
next_ch = format[i]
290+
i += 1
291+
if next_ch not in 'dmHIMSjUWVy':
292+
push('%%-' + next_ch)
293+
else:
294+
push('%-' + next_ch)
295+
else:
296+
push('%-')
287297
else:
288298
push('%')
289299
push(ch)

Lib/test/datetimetester.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import textwrap
1616
import unittest
1717
import warnings
18+
import platform
1819

1920
from array import array
2021

@@ -1589,6 +1590,11 @@ def test_strftime(self):
15891590
self.assertEqual(t.strftime(""), "") # SF bug #761337
15901591
self.assertEqual(t.strftime('x'*1000), 'x'*1000) # SF bug #1556784
15911592

1593+
# unsupported %-format specifiers are passed through unchanged.
1594+
self.assertEqual(t.strftime("%-1"), "%-1")
1595+
self.assertEqual(t.strftime("%--"), "%--")
1596+
self.assertEqual(t.strftime("%-#"), "%-#")
1597+
15921598
self.assertRaises(TypeError, t.strftime) # needs an arg
15931599
self.assertRaises(TypeError, t.strftime, "one", "two") # too many args
15941600
self.assertRaises(TypeError, t.strftime, 42) # arg wrong type

Modules/_datetimemodule.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,6 +2003,20 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
20032003
}
20042004
continue;
20052005
}
2006+
else if (ch == '-' && i < flen) {
2007+
Py_UCS4 next_ch = PyUnicode_READ_CHAR(format, i);
2008+
i++;
2009+
2010+
if (strchr("dmHIMSjUWVy", (int)next_ch) == NULL) {
2011+
replacement = PyUnicode_FromFormat("%%%%-%c", (char)next_ch);
2012+
if (replacement == NULL) {
2013+
goto Error;
2014+
}
2015+
}
2016+
else {
2017+
continue;
2018+
}
2019+
}
20062020
else {
20072021
/* percent followed by something else */
20082022
continue;

0 commit comments

Comments
 (0)