object.__format__ now contains the name of actual type.
import pickle
import platform
import random
+import re
import sys
import traceback
import types
# --------------------------------------------------------------------
# Issue #7994: object.__format__ with a non-empty format string is
- # deprecated
- def test_deprecated_format_string(obj, fmt_str, should_raise):
- if should_raise:
- self.assertRaises(TypeError, format, obj, fmt_str)
- else:
- format(obj, fmt_str)
-
- fmt_strs = ['', 's']
-
+ # disallowed
class A:
def __format__(self, fmt_str):
return format('', fmt_str)
- for fmt_str in fmt_strs:
- test_deprecated_format_string(A(), fmt_str, False)
+ self.assertEqual(format(A()), '')
+ self.assertEqual(format(A(), ''), '')
+ self.assertEqual(format(A(), 's'), '')
class B:
pass
pass
for cls in [object, B, C]:
- for fmt_str in fmt_strs:
- test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
+ obj = cls()
+ self.assertEqual(format(obj), str(obj))
+ self.assertEqual(format(obj, ''), str(obj))
+ with self.assertRaisesRegex(TypeError,
+ r'\b%s\b' % re.escape(cls.__name__)):
+ format(obj, 's')
# --------------------------------------------------------------------
# make sure we can take a subclass of str as a format spec
self.assertEqual(f(b"'"), '''b"'"''') # '''
self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
+ @check_bytes_warnings
+ def test_format(self):
+ for b in b'abc', bytearray(b'abc'):
+ self.assertEqual(format(b), str(b))
+ self.assertEqual(format(b, ''), str(b))
+ with self.assertRaisesRegex(TypeError,
+ r'\b%s\b' % re.escape(type(b).__name__)):
+ format(b, 's')
+
def test_compare_bytes_to_bytearray(self):
self.assertEqual(b"abc" == bytes(b"abc"), True)
self.assertEqual(b"ab" != bytes(b"abc"), True)
"NotImplemented, the normal algorithm is used. Otherwise, it\n"
"overrides the normal algorithm (and the outcome is cached).\n");
-/*
- from PEP 3101, this code implements:
-
- class object:
- def __format__(self, format_spec):
- return format(str(self), format_spec)
-*/
static PyObject *
object_format(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
+ /* Issue 7994: If we're converting to a string, we
+ should reject format specifications */
+ if (PyUnicode_GET_LENGTH(format_spec) > 0) {
+ PyErr_Format(PyExc_TypeError,
+ "unsupported format string passed to %.200s.__format__",
+ self->ob_type->tp_name);
+ return NULL;
+ }
self_as_str = PyObject_Str(self);
if (self_as_str != NULL) {
- /* Issue 7994: If we're converting to a string, we
- should reject format specifications */
- if (PyUnicode_GET_LENGTH(format_spec) > 0) {
- PyErr_SetString(PyExc_TypeError,
- "non-empty format string passed to object.__format__");
- goto done;
- }
-
result = PyObject_Format(self_as_str, format_spec);
+ Py_DECREF(self_as_str);
}
-
-done:
- Py_XDECREF(self_as_str);
-
return result;
}