Changed to use 'U' argument to PyArg_ParseTuple, instead of manually checking for unicode objects.
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 @@
     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 @@
     PyObject *tmp = 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) */
@@ -917,12 +909,8 @@
     PyObject *tmp = 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) */
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