]> granicus.if.org Git - python/commitdiff
add keyword arguments support to str/unicode encode and decode #6300
authorBenjamin Peterson <benjamin@python.org>
Fri, 18 Sep 2009 21:14:55 +0000 (21:14 +0000)
committerBenjamin Peterson <benjamin@python.org>
Fri, 18 Sep 2009 21:14:55 +0000 (21:14 +0000)
Doc/library/stdtypes.rst
Lib/test/test_str.py
Lib/test/test_unicode.py
Misc/ACKS
Misc/NEWS
Objects/stringobject.c
Objects/unicodeobject.c

index 93ed710b1fa060b8e6791493cbbf9b032e66d2b9..d2dfd11de941096a674a57e2bc42d9db70fb5e9f 100644 (file)
@@ -815,8 +815,8 @@ String Methods
 
 .. index:: pair: string; methods
 
-Below are listed the string methods which both 8-bit strings and Unicode objects
-support. Note that none of these methods take keyword arguments.
+Below are listed the string methods which both 8-bit strings and
+Unicode objects support.
 
 In addition, Python's strings support the sequence type methods
 described in the :ref:`typesseq` section. To output formatted strings
@@ -861,6 +861,8 @@ string functions based on regular expressions.
    .. versionchanged:: 2.3
       Support for other error handling schemes added.
 
+   .. versionchanged:: 2.7
+      Support for keyword arguments added.
 
 .. method:: str.encode([encoding[,errors]])
 
@@ -879,6 +881,8 @@ string functions based on regular expressions.
       Support for ``'xmlcharrefreplace'`` and ``'backslashreplace'`` and other error
       handling schemes added.
 
+   .. versionchanged:: 2.7
+      Support for keyword arguments added.
 
 .. method:: str.endswith(suffix[, start[, end]])
 
index c546154e66992d4f9f032a1916902bb69aca5d12..fa86db413b1d4a88bf11771d581d74b9a1db5b7b 100644 (file)
@@ -401,6 +401,17 @@ class StrTest(
     def test_buffer_is_readonly(self):
         self.assertRaises(TypeError, sys.stdin.readinto, b"")
 
+    def test_encode_and_decode_kwargs(self):
+        self.assertEqual('abcde'.encode('ascii', 'replace'),
+                         'abcde'.encode('ascii', errors='replace'))
+        self.assertEqual('abcde'.encode('ascii', 'ignore'),
+                         'abcde'.encode(encoding='ascii', errors='ignore'))
+        self.assertEqual('Andr\202 x'.decode('ascii', 'ignore'),
+                         'Andr\202 x'.decode('ascii', errors='ignore'))
+        self.assertEqual('Andr\202 x'.decode('ascii', 'replace'),
+                         'Andr\202 x'.decode(encoding='ascii', errors='replace'))
+
+
 
 def test_main():
     test_support.run_unittest(StrTest)
index 43830b2ecf8fa8e8346e514f18331a44404df67a..2b269cc6223f59937e8ab35696ff7c7bb2b829c7 100644 (file)
@@ -593,12 +593,20 @@ class UnicodeTest(
         self.assertRaises(UnicodeError, u'Andr\202 x'.encode, 'ascii','strict')
         self.assertEqual(u'Andr\202 x'.encode('ascii','ignore'), "Andr x")
         self.assertEqual(u'Andr\202 x'.encode('ascii','replace'), "Andr? x")
+        self.assertEqual(u'Andr\202 x'.encode('ascii', 'replace'),
+                         u'Andr\202 x'.encode('ascii', errors='replace'))
+        self.assertEqual(u'Andr\202 x'.encode('ascii', 'ignore'),
+                         u'Andr\202 x'.encode(encoding='ascii', errors='ignore'))
 
         # Error handling (decoding)
         self.assertRaises(UnicodeError, unicode, 'Andr\202 x', 'ascii')
         self.assertRaises(UnicodeError, unicode, 'Andr\202 x', 'ascii','strict')
         self.assertEqual(unicode('Andr\202 x','ascii','ignore'), u"Andr x")
         self.assertEqual(unicode('Andr\202 x','ascii','replace'), u'Andr\uFFFD x')
+        self.assertEqual(u'abcde'.decode('ascii', 'ignore'),
+                         u'abcde'.decode('ascii', errors='ignore'))
+        self.assertEqual(u'abcde'.decode('ascii', 'replace'),
+                         u'abcde'.decode(encoding='ascii', errors='replace'))
 
         # Error handling (unknown character names)
         self.assertEqual("\\N{foo}xx".decode("unicode-escape", "ignore"), u"xx")
index 53e386ae37798e4d84201e7e1191c4453e1b1175..e0bd435005a61f36560aef91dfe81547a2cb9e98 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -88,6 +88,7 @@ Peter Bosch
 Eric Bouck
 Thierry Bousch
 Sebastian Boving
+Jeff Bradberry
 Monty Brandenberg
 Georg Brandl
 Christopher Brannon
index 0ce1168035a145750d8e59d9aaa33ac91ecfe6db..66ee55323ea6c58da698ad570e41bbf3d64e714f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue #6300: unicode.encode, unicode.docode, str.decode, and str.encode now
+  take keyword arguments.
+
 - Issue #6922: Fix an infinite loop when trying to decode an invalid
   UTF-32 stream with a non-raising error handler like "replace" or "ignore".
 
index 6d933a10fb71d360723422f46a04195d9a9e9f57..1233fc0cc909e70aceed00de396faf88b700cac4 100644 (file)
@@ -3332,13 +3332,15 @@ a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\
 codecs.register_error that is able to handle UnicodeEncodeErrors.");
 
 static PyObject *
-string_encode(PyStringObject *self, PyObject *args)
+string_encode(PyStringObject *self, PyObject *args, PyObject *kwargs)
 {
+    static char *kwlist[] = {"encoding", "errors", 0};
     char *encoding = NULL;
     char *errors = NULL;
     PyObject *v;
 
-    if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors))
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode",
+                                    kwlist, &encoding, &errors))
         return NULL;
     v = PyString_AsEncodedObject((PyObject *)self, encoding, errors);
     if (v == NULL)
@@ -3369,13 +3371,15 @@ as well as any other name registered with codecs.register_error that is\n\
 able to handle UnicodeDecodeErrors.");
 
 static PyObject *
-string_decode(PyStringObject *self, PyObject *args)
+string_decode(PyStringObject *self, PyObject *args, PyObject *kwargs)
 {
+    static char *kwlist[] = {"encoding", "errors", 0};
     char *encoding = NULL;
     char *errors = NULL;
     PyObject *v;
 
-    if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode",
+                                    kwlist, &encoding, &errors))
         return NULL;
     v = PyString_AsDecodedObject((PyObject *)self, encoding, errors);
     if (v == NULL)
@@ -4053,8 +4057,8 @@ string_methods[] = {
        {"__format__", (PyCFunction) string__format__, METH_VARARGS, p_format__doc__},
        {"_formatter_field_name_split", (PyCFunction) formatter_field_name_split, METH_NOARGS},
        {"_formatter_parser", (PyCFunction) formatter_parser, METH_NOARGS},
-       {"encode", (PyCFunction)string_encode, METH_VARARGS, encode__doc__},
-       {"decode", (PyCFunction)string_decode, METH_VARARGS, decode__doc__},
+       {"encode", (PyCFunction)string_encode, METH_VARARGS | METH_KEYWORDS, encode__doc__},
+       {"decode", (PyCFunction)string_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__},
        {"expandtabs", (PyCFunction)string_expandtabs, METH_VARARGS,
         expandtabs__doc__},
        {"splitlines", (PyCFunction)string_splitlines, METH_VARARGS,
index 61645101171a140624eb0e8d6cd592f00797ad3e..2028d96b6bf400cdcae5de9424b08b07aa89dc2f 100644 (file)
@@ -6610,13 +6610,15 @@ a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\
 codecs.register_error that can handle UnicodeEncodeErrors.");
 
 static PyObject *
-unicode_encode(PyUnicodeObject *self, PyObject *args)
+unicode_encode(PyUnicodeObject *self, PyObject *args, PyObject *kwargs)
 {
+    static char *kwlist[] = {"encoding", "errors", 0};
     char *encoding = NULL;
     char *errors = NULL;
     PyObject *v;
 
-    if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors))
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode",
+                                     kwlist, &encoding, &errors))
         return NULL;
     v = PyUnicode_AsEncodedObject((PyObject *)self, encoding, errors);
     if (v == NULL)
@@ -6646,13 +6648,15 @@ as well as any other name registerd with codecs.register_error that is\n\
 able to handle UnicodeDecodeErrors.");
 
 static PyObject *
-unicode_decode(PyUnicodeObject *self, PyObject *args)
+unicode_decode(PyUnicodeObject *self, PyObject *args, PyObject *kwargs)
 {
+    static char *kwlist[] = {"encoding", "errors", 0};
     char *encoding = NULL;
     char *errors = NULL;
     PyObject *v;
 
-    if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors))
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode",
+                                     kwlist, &encoding, &errors))
         return NULL;
     v = PyUnicode_AsDecodedObject((PyObject *)self, encoding, errors);
     if (v == NULL)
@@ -8054,7 +8058,7 @@ static PyMethodDef unicode_methods[] = {
     /* Order is according to common usage: often used methods should
        appear first, since lookup is done sequentially. */
 
-    {"encode", (PyCFunction) unicode_encode, METH_VARARGS, encode__doc__},
+    {"encode", (PyCFunction) unicode_encode, METH_VARARGS | METH_KEYWORDS, encode__doc__},
     {"replace", (PyCFunction) unicode_replace, METH_VARARGS, replace__doc__},
     {"split", (PyCFunction) unicode_split, METH_VARARGS, split__doc__},
     {"rsplit", (PyCFunction) unicode_rsplit, METH_VARARGS, rsplit__doc__},
@@ -8070,7 +8074,7 @@ static PyMethodDef unicode_methods[] = {
     {"ljust", (PyCFunction) unicode_ljust, METH_VARARGS, ljust__doc__},
     {"lower", (PyCFunction) unicode_lower, METH_NOARGS, lower__doc__},
     {"lstrip", (PyCFunction) unicode_lstrip, METH_VARARGS, lstrip__doc__},
-    {"decode", (PyCFunction) unicode_decode, METH_VARARGS, decode__doc__},
+    {"decode", (PyCFunction) unicode_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__},
 /*  {"maketrans", (PyCFunction) unicode_maketrans, METH_VARARGS, maketrans__doc__}, */
     {"rfind", (PyCFunction) unicode_rfind, METH_VARARGS, rfind__doc__},
     {"rindex", (PyCFunction) unicode_rindex, METH_VARARGS, rindex__doc__},