From 37f10386f1bedb992f3d9770b2f71b5edda2abbe Mon Sep 17 00:00:00 2001 From: Eric Smith Date: Sat, 1 Sep 2007 10:56:01 +0000 Subject: Changed to use 'U' argument to PyArg_ParseTuple, instead of manually checking for unicode objects. --- Lib/test/test_builtin.py | 12 ++++++++++-- Lib/test/test_unicode.py | 3 --- Objects/stringlib/formatter.h | 18 +++--------------- Objects/stringlib/stringdefs.h | 1 + Objects/stringlib/unicodedefs.h | 1 + Python/bltinmodule.c | 2 +- 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 1a9781b..d9633af 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -525,10 +525,15 @@ class BuiltinTest(unittest.TestCase): return str(self.x) + format_spec # class that returns a bad type from __format__ - class H: + class B: def __format__(self, format_spec): return 1.0 + # class that is derived from string, used + # as a format spec + class C(str): + pass + self.assertEqual(format(3, ''), '3') self.assertEqual(format(A(3), 'spec'), '3spec') @@ -550,7 +555,10 @@ class BuiltinTest(unittest.TestCase): empty_format_spec(None) # TypeError because self.__format__ returns the wrong type - self.assertRaises(TypeError, format, H(), "") + self.assertRaises(TypeError, format, B(), "") + + # make sure we can take a subclass of str as a format spec + self.assertEqual(format(0, C('10')), ' 0') def test_getattr(self): import sys diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 444656a..6773f2a 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -581,9 +581,6 @@ class UnicodeTest( self.assertRaises(ValueError, format, "", "-") self.assertRaises(ValueError, "{0:=s}".format, '') - # check that __format__ returns a string - #self.assertRaises(TypeError, "{0}".format, H()) - def test_formatting(self): string_tests.MixinStrUnicodeUserStringTest.test_formatting(self) # Testing Unicode formatting strings... diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h index 8e2b8ef..ee0971d 100644 --- a/Objects/stringlib/formatter.h +++ b/Objects/stringlib/formatter.h @@ -768,12 +768,8 @@ FORMAT_STRING(PyObject* value, PyObject* args) PyObject *result = NULL; InternalFormatSpec format; - if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) + if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", &format_spec)) goto done; - if (!STRINGLIB_CHECK(format_spec)) { - PyErr_SetString(PyExc_TypeError, STRINGLIB_TYPE_NAME " object required"); - goto done; - } /* check for the special case of zero length format spec, make it equivalent to str(value) */ @@ -843,12 +839,8 @@ FORMAT_LONG(PyObject* value, PyObject* args) PyObject *tmp = NULL; InternalFormatSpec format; - if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) - goto done; - if (!STRINGLIB_CHECK(format_spec)) { - PyErr_SetString(PyExc_TypeError, STRINGLIB_TYPE_NAME " object required"); + if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", &format_spec)) goto done; - } /* check for the special case of zero length format spec, make it equivalent to str(value) */ @@ -917,12 +909,8 @@ FORMAT_FLOAT(PyObject *value, PyObject *args) PyObject *tmp = NULL; InternalFormatSpec format; - if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) - goto done; - if (!STRINGLIB_CHECK(format_spec)) { - PyErr_SetString(PyExc_TypeError, STRINGLIB_TYPE_NAME " object required"); + if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", &format_spec)) goto done; - } /* check for the special case of zero length format spec, make it equivalent to str(value) */ diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h index af9bbd6..a4be17f 100644 --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -8,6 +8,7 @@ #define STRINGLIB_CHAR char #define STRINGLIB_TYPE_NAME "string" +#define STRINGLIB_PARSE_CODE "S" #define STRINGLIB_EMPTY string_empty #define STRINGLIB_ISDECIMAL(x) ((x >= '0') && (x <= '9')) #define STRINGLIB_TODECIMAL(x) (STRINGLIB_ISDECIMAL(x) ? (x - '0') : -1) diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h index a50a3f2..25c1d4f 100644 --- a/Objects/stringlib/unicodedefs.h +++ b/Objects/stringlib/unicodedefs.h @@ -8,6 +8,7 @@ #define STRINGLIB_CHAR Py_UNICODE #define STRINGLIB_TYPE_NAME "unicode" +#define STRINGLIB_PARSE_CODE "U" #define STRINGLIB_EMPTY unicode_empty #define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL #define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index c4fc57d..6675abf 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -293,7 +293,7 @@ builtin_format(PyObject *self, PyObject *args) goto done; } - if (!PyArg_ParseTuple(args, "O|O:format", &value, &spec)) + if (!PyArg_ParseTuple(args, "O|U:format", &value, &spec)) goto done; /* initialize the default value */ -- cgit v0.12