Skip to content

Commit cc0d5e5

Browse files
authored
gh-94226: Remove the locale.format() function (#94229)
Remove the locale.format() function, deprecated in Python 3.7: use locale.format_string() instead. Remove TestFormatPatternArg test case: it is irrelevant for locale.format_string() which accepts complex formats.
1 parent 44c8e68 commit cc0d5e5

File tree

6 files changed

+58
-102
lines changed

6 files changed

+58
-102
lines changed

Doc/library/locale.rst

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,6 @@ The :mod:`locale` module defines the following exception and functions:
412412
The *monetary* keyword parameter was added.
413413

414414

415-
.. function:: format(format, val, grouping=False, monetary=False)
416-
417-
Please note that this function works like :meth:`format_string` but will
418-
only work for exactly one ``%char`` specifier. For example, ``'%f'`` and
419-
``'%.0f'`` are both valid specifiers, but ``'%f KiB'`` is not.
420-
421-
For whole format strings, use :func:`format_string`.
422-
423-
.. deprecated:: 3.7
424-
Use :meth:`format_string` instead.
425-
426-
427415
.. function:: currency(val, symbol=True, grouping=False, international=False)
428416

429417
Formats a number *val* according to the current :const:`LC_MONETARY` settings.
@@ -507,7 +495,7 @@ The :mod:`locale` module defines the following exception and functions:
507495

508496
.. data:: LC_NUMERIC
509497

510-
Locale category for formatting numbers. The functions :func:`.format`,
498+
Locale category for formatting numbers. The functions :func:`format_string`,
511499
:func:`atoi`, :func:`atof` and :func:`.str` of the :mod:`locale` module are
512500
affected by that category. All other numeric formatting operations are not
513501
affected.
@@ -569,7 +557,7 @@ document that your module is not compatible with non-\ ``C`` locale settings.
569557

570558
The only way to perform numeric operations according to the locale is to use the
571559
special functions defined by this module: :func:`atof`, :func:`atoi`,
572-
:func:`.format`, :func:`.str`.
560+
:func:`format_string`, :func:`.str`.
573561

574562
There is no way to perform case conversions and character classifications
575563
according to the locale. For (Unicode) text strings these are done according

Doc/tutorial/stdlib2.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ formatting numbers with group separators::
5959
'English_United States.1252'
6060
>>> conv = locale.localeconv() # get a mapping of conventions
6161
>>> x = 1234567.8
62-
>>> locale.format("%d", x, grouping=True)
62+
>>> locale.format_string("%d", x, grouping=True)
6363
'1,234,567'
6464
>>> locale.format_string("%s%.*f", (conv['currency_symbol'],
6565
... conv['frac_digits'], x), grouping=True)

Doc/whatsnew/3.12.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,11 @@ Removed
269269
:func:`ssl.match_hostname` function.
270270
(Contributed by Victor Stinner in :gh:`94199`.)
271271

272+
* Remove the :func:`locale.format` function, deprecated in Python 3.7:
273+
use :func:`locale.format_string` instead.
274+
(Contributed by Victor Stinner in :gh:`94226`.)
275+
276+
272277
Porting to Python 3.12
273278
======================
274279

Lib/locale.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
# trying the import. So __all__ is also fiddled at the end of the file.
2727
__all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error",
2828
"setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm",
29-
"str", "atof", "atoi", "format", "format_string", "currency",
29+
"str", "atof", "atoi", "format_string", "currency",
3030
"normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY",
3131
"LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding"]
3232

@@ -247,21 +247,6 @@ def format_string(f, val, grouping=False, monetary=False):
247247

248248
return new_f % val
249249

250-
def format(percent, value, grouping=False, monetary=False, *additional):
251-
"""Deprecated, use format_string instead."""
252-
import warnings
253-
warnings.warn(
254-
"This method will be removed in a future version of Python. "
255-
"Use 'locale.format_string()' instead.",
256-
DeprecationWarning, stacklevel=2
257-
)
258-
259-
match = _percent_re.match(percent)
260-
if not match or len(match.group())!= len(percent):
261-
raise ValueError(("format() must be given exactly one %%char "
262-
"format specifier, %s not valid") % repr(percent))
263-
return _format(percent, value, grouping, monetary, *additional)
264-
265250
def currency(val, symbol=True, grouping=False, international=False):
266251
"""Formats val according to the currency settings
267252
in the current locale."""

Lib/test/test_locale.py

Lines changed: 47 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -141,18 +141,9 @@ class BaseFormattingTest(object):
141141
# Utility functions for formatting tests
142142
#
143143

144-
def _test_formatfunc(self, format, value, out, func, **format_opts):
145-
self.assertEqual(
146-
func(format, value, **format_opts), out)
147-
148-
def _test_format(self, format, value, out, **format_opts):
149-
with check_warnings(('', DeprecationWarning)):
150-
self._test_formatfunc(format, value, out,
151-
func=locale.format, **format_opts)
152-
153144
def _test_format_string(self, format, value, out, **format_opts):
154-
self._test_formatfunc(format, value, out,
155-
func=locale.format_string, **format_opts)
145+
self.assertEqual(
146+
locale.format_string(format, value, **format_opts), out)
156147

157148
def _test_currency(self, value, out, **format_opts):
158149
self.assertEqual(locale.currency(value, **format_opts), out)
@@ -166,44 +157,40 @@ def setUp(self):
166157
self.sep = locale.localeconv()['thousands_sep']
167158

168159
def test_grouping(self):
169-
self._test_format("%f", 1024, grouping=1, out='1%s024.000000' % self.sep)
170-
self._test_format("%f", 102, grouping=1, out='102.000000')
171-
self._test_format("%f", -42, grouping=1, out='-42.000000')
172-
self._test_format("%+f", -42, grouping=1, out='-42.000000')
160+
self._test_format_string("%f", 1024, grouping=1, out='1%s024.000000' % self.sep)
161+
self._test_format_string("%f", 102, grouping=1, out='102.000000')
162+
self._test_format_string("%f", -42, grouping=1, out='-42.000000')
163+
self._test_format_string("%+f", -42, grouping=1, out='-42.000000')
173164

174165
def test_grouping_and_padding(self):
175-
self._test_format("%20.f", -42, grouping=1, out='-42'.rjust(20))
166+
self._test_format_string("%20.f", -42, grouping=1, out='-42'.rjust(20))
176167
if self.sep:
177-
self._test_format("%+10.f", -4200, grouping=1,
168+
self._test_format_string("%+10.f", -4200, grouping=1,
178169
out=('-4%s200' % self.sep).rjust(10))
179-
self._test_format("%-10.f", -4200, grouping=1,
170+
self._test_format_string("%-10.f", -4200, grouping=1,
180171
out=('-4%s200' % self.sep).ljust(10))
181172

182173
def test_integer_grouping(self):
183-
self._test_format("%d", 4200, grouping=True, out='4%s200' % self.sep)
184-
self._test_format("%+d", 4200, grouping=True, out='+4%s200' % self.sep)
185-
self._test_format("%+d", -4200, grouping=True, out='-4%s200' % self.sep)
174+
self._test_format_string("%d", 4200, grouping=True, out='4%s200' % self.sep)
175+
self._test_format_string("%+d", 4200, grouping=True, out='+4%s200' % self.sep)
176+
self._test_format_string("%+d", -4200, grouping=True, out='-4%s200' % self.sep)
186177

187178
def test_integer_grouping_and_padding(self):
188-
self._test_format("%10d", 4200, grouping=True,
179+
self._test_format_string("%10d", 4200, grouping=True,
189180
out=('4%s200' % self.sep).rjust(10))
190-
self._test_format("%-10d", -4200, grouping=True,
181+
self._test_format_string("%-10d", -4200, grouping=True,
191182
out=('-4%s200' % self.sep).ljust(10))
192183

193184
def test_simple(self):
194-
self._test_format("%f", 1024, grouping=0, out='1024.000000')
195-
self._test_format("%f", 102, grouping=0, out='102.000000')
196-
self._test_format("%f", -42, grouping=0, out='-42.000000')
197-
self._test_format("%+f", -42, grouping=0, out='-42.000000')
185+
self._test_format_string("%f", 1024, grouping=0, out='1024.000000')
186+
self._test_format_string("%f", 102, grouping=0, out='102.000000')
187+
self._test_format_string("%f", -42, grouping=0, out='-42.000000')
188+
self._test_format_string("%+f", -42, grouping=0, out='-42.000000')
198189

199190
def test_padding(self):
200-
self._test_format("%20.f", -42, grouping=0, out='-42'.rjust(20))
201-
self._test_format("%+10.f", -4200, grouping=0, out='-4200'.rjust(10))
202-
self._test_format("%-10.f", 4200, grouping=0, out='4200'.ljust(10))
203-
204-
def test_format_deprecation(self):
205-
with self.assertWarns(DeprecationWarning):
206-
locale.format("%-10.f", 4200, grouping=True)
191+
self._test_format_string("%20.f", -42, grouping=0, out='-42'.rjust(20))
192+
self._test_format_string("%+10.f", -4200, grouping=0, out='-4200'.rjust(10))
193+
self._test_format_string("%-10.f", 4200, grouping=0, out='4200'.ljust(10))
207194

208195
def test_complex_formatting(self):
209196
# Spaces in formatting string
@@ -230,20 +217,9 @@ def test_complex_formatting(self):
230217
out='int 1%s000 float 1%s000.00 str str' %
231218
(self.sep, self.sep))
232219

233-
234-
class TestFormatPatternArg(unittest.TestCase):
235-
# Test handling of pattern argument of format
236-
237-
def test_onlyOnePattern(self):
238-
with check_warnings(('', DeprecationWarning)):
239-
# Issue 2522: accept exactly one % pattern, and no extra chars.
240-
self.assertRaises(ValueError, locale.format, "%f\n", 'foo')
241-
self.assertRaises(ValueError, locale.format, "%f\r", 'foo')
242-
self.assertRaises(ValueError, locale.format, "%f\r\n", 'foo')
243-
self.assertRaises(ValueError, locale.format, " %f", 'foo')
244-
self.assertRaises(ValueError, locale.format, "%fg", 'foo')
245-
self.assertRaises(ValueError, locale.format, "%^g", 'foo')
246-
self.assertRaises(ValueError, locale.format, "%f%%", 'foo')
220+
self._test_format_string("total=%i%%", 100, out='total=100%')
221+
self._test_format_string("newline: %i\n", 3, out='newline: 3\n')
222+
self._test_format_string("extra: %ii", 3, out='extra: 3i')
247223

248224

249225
class TestLocaleFormatString(unittest.TestCase):
@@ -292,45 +268,45 @@ class TestCNumberFormatting(CCookedTest, BaseFormattingTest):
292268
# Test number formatting with a cooked "C" locale.
293269

294270
def test_grouping(self):
295-
self._test_format("%.2f", 12345.67, grouping=True, out='12345.67')
271+
self._test_format_string("%.2f", 12345.67, grouping=True, out='12345.67')
296272

297273
def test_grouping_and_padding(self):
298-
self._test_format("%9.2f", 12345.67, grouping=True, out=' 12345.67')
274+
self._test_format_string("%9.2f", 12345.67, grouping=True, out=' 12345.67')
299275

300276

301277
class TestFrFRNumberFormatting(FrFRCookedTest, BaseFormattingTest):
302278
# Test number formatting with a cooked "fr_FR" locale.
303279

304280
def test_decimal_point(self):
305-
self._test_format("%.2f", 12345.67, out='12345,67')
281+
self._test_format_string("%.2f", 12345.67, out='12345,67')
306282

307283
def test_grouping(self):
308-
self._test_format("%.2f", 345.67, grouping=True, out='345,67')
309-
self._test_format("%.2f", 12345.67, grouping=True, out='12 345,67')
284+
self._test_format_string("%.2f", 345.67, grouping=True, out='345,67')
285+
self._test_format_string("%.2f", 12345.67, grouping=True, out='12 345,67')
310286

311287
def test_grouping_and_padding(self):
312-
self._test_format("%6.2f", 345.67, grouping=True, out='345,67')
313-
self._test_format("%7.2f", 345.67, grouping=True, out=' 345,67')
314-
self._test_format("%8.2f", 12345.67, grouping=True, out='12 345,67')
315-
self._test_format("%9.2f", 12345.67, grouping=True, out='12 345,67')
316-
self._test_format("%10.2f", 12345.67, grouping=True, out=' 12 345,67')
317-
self._test_format("%-6.2f", 345.67, grouping=True, out='345,67')
318-
self._test_format("%-7.2f", 345.67, grouping=True, out='345,67 ')
319-
self._test_format("%-8.2f", 12345.67, grouping=True, out='12 345,67')
320-
self._test_format("%-9.2f", 12345.67, grouping=True, out='12 345,67')
321-
self._test_format("%-10.2f", 12345.67, grouping=True, out='12 345,67 ')
288+
self._test_format_string("%6.2f", 345.67, grouping=True, out='345,67')
289+
self._test_format_string("%7.2f", 345.67, grouping=True, out=' 345,67')
290+
self._test_format_string("%8.2f", 12345.67, grouping=True, out='12 345,67')
291+
self._test_format_string("%9.2f", 12345.67, grouping=True, out='12 345,67')
292+
self._test_format_string("%10.2f", 12345.67, grouping=True, out=' 12 345,67')
293+
self._test_format_string("%-6.2f", 345.67, grouping=True, out='345,67')
294+
self._test_format_string("%-7.2f", 345.67, grouping=True, out='345,67 ')
295+
self._test_format_string("%-8.2f", 12345.67, grouping=True, out='12 345,67')
296+
self._test_format_string("%-9.2f", 12345.67, grouping=True, out='12 345,67')
297+
self._test_format_string("%-10.2f", 12345.67, grouping=True, out='12 345,67 ')
322298

323299
def test_integer_grouping(self):
324-
self._test_format("%d", 200, grouping=True, out='200')
325-
self._test_format("%d", 4200, grouping=True, out='4 200')
300+
self._test_format_string("%d", 200, grouping=True, out='200')
301+
self._test_format_string("%d", 4200, grouping=True, out='4 200')
326302

327303
def test_integer_grouping_and_padding(self):
328-
self._test_format("%4d", 4200, grouping=True, out='4 200')
329-
self._test_format("%5d", 4200, grouping=True, out='4 200')
330-
self._test_format("%10d", 4200, grouping=True, out='4 200'.rjust(10))
331-
self._test_format("%-4d", 4200, grouping=True, out='4 200')
332-
self._test_format("%-5d", 4200, grouping=True, out='4 200')
333-
self._test_format("%-10d", 4200, grouping=True, out='4 200'.ljust(10))
304+
self._test_format_string("%4d", 4200, grouping=True, out='4 200')
305+
self._test_format_string("%5d", 4200, grouping=True, out='4 200')
306+
self._test_format_string("%10d", 4200, grouping=True, out='4 200'.rjust(10))
307+
self._test_format_string("%-4d", 4200, grouping=True, out='4 200')
308+
self._test_format_string("%-5d", 4200, grouping=True, out='4 200')
309+
self._test_format_string("%-10d", 4200, grouping=True, out='4 200'.ljust(10))
334310

335311
def test_currency(self):
336312
euro = '\u20ac'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Remove the :func:`locale.format` function, deprecated in Python 3.7: use
2+
:func:`locale.format_string` instead. Patch by Victor Stinner.

0 commit comments

Comments
 (0)