[Python-checkins] r54772 - in python/trunk: Doc/lib/libstdtypes.tex Doc/lib/libstring.tex Lib/string.py Lib/test/string_tests.py Misc/NEWS Objects/stringobject.c

raymond.hettinger python-checkins at python.org
Thu Apr 12 06:10:04 CEST 2007


Author: raymond.hettinger
Date: Thu Apr 12 06:10:00 2007
New Revision: 54772

Modified:
   python/trunk/Doc/lib/libstdtypes.tex
   python/trunk/Doc/lib/libstring.tex
   python/trunk/Lib/string.py
   python/trunk/Lib/test/string_tests.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/stringobject.c
Log:
SF 1193128:  Let str.translate(None) be an identity transformation

Modified: python/trunk/Doc/lib/libstdtypes.tex
==============================================================================
--- python/trunk/Doc/lib/libstdtypes.tex	(original)
+++ python/trunk/Doc/lib/libstdtypes.tex	Thu Apr 12 06:10:00 2007
@@ -878,6 +878,13 @@
 
 You can use the \function{maketrans()} helper function in the
 \refmodule{string} module to create a translation table.
+For string objects, set the \var{table} argument to \code{None}
+for translations that only delete characters:
+\begin{verbatim}
+    >>> 'read this short text'.translate(None, 'aeiou')
+    'rd ths shrt txt'
+\end{verbatim}
+\versionadded[Support for a \code{None} \var{table} argument]{2.6}
 
 For Unicode objects, the \method{translate()} method does not
 accept the optional \var{deletechars} argument.  Instead, it

Modified: python/trunk/Doc/lib/libstring.tex
==============================================================================
--- python/trunk/Doc/lib/libstring.tex	(original)
+++ python/trunk/Doc/lib/libstring.tex	Thu Apr 12 06:10:00 2007
@@ -419,7 +419,8 @@
   Delete all characters from \var{s} that are in \var{deletechars} (if 
   present), and then translate the characters using \var{table}, which 
   must be a 256-character string giving the translation for each
-  character value, indexed by its ordinal.
+  character value, indexed by its ordinal.  If \var{table} is \code{None},
+  then only the character deletion step is performed.
 \end{funcdesc}
 
 \begin{funcdesc}{upper}{s}

Modified: python/trunk/Lib/string.py
==============================================================================
--- python/trunk/Lib/string.py	(original)
+++ python/trunk/Lib/string.py	Thu Apr 12 06:10:00 2007
@@ -487,7 +487,7 @@
     deletions argument is not allowed for Unicode strings.
 
     """
-    if deletions:
+    if deletions or table is None:
         return s.translate(table, deletions)
     else:
         # Add s[:0] so that if s is Unicode and table is an 8-bit string,

Modified: python/trunk/Lib/test/string_tests.py
==============================================================================
--- python/trunk/Lib/test/string_tests.py	(original)
+++ python/trunk/Lib/test/string_tests.py	Thu Apr 12 06:10:00 2007
@@ -1096,6 +1096,9 @@
         self.checkequal('Abc', 'abc', 'translate', table)
         self.checkequal('xyz', 'xyz', 'translate', table)
         self.checkequal('yz', 'xyz', 'translate', table, 'x')
+        self.checkequal('yx', 'zyzzx', 'translate', None, 'z')    
+        self.checkequal('zyzzx', 'zyzzx', 'translate', None, '')
+        self.checkequal('zyzzx', 'zyzzx', 'translate', None)        
         self.checkraises(ValueError, 'xyz', 'translate', 'too short', 'strip')
         self.checkraises(ValueError, 'xyz', 'translate', 'too short')
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Apr 12 06:10:00 2007
@@ -14,6 +14,10 @@
 
 - Request #1191699:  Slices can now be pickled.
 
+- Request #1193128:  str.translate() now allows a None argument for
+  translations that only remove characters without re-mapping the
+  remaining characters.
+
 - Patch #1682205: a TypeError while unpacking an iterable is no longer
   masked by a generic one with the message "unpack non-sequence".
 

Modified: python/trunk/Objects/stringobject.c
==============================================================================
--- python/trunk/Objects/stringobject.c	(original)
+++ python/trunk/Objects/stringobject.c	Thu Apr 12 06:10:00 2007
@@ -2344,10 +2344,10 @@
 string_translate(PyStringObject *self, PyObject *args)
 {
 	register char *input, *output;
-	register const char *table;
+	const char *table;
 	register Py_ssize_t i, c, changed = 0;
 	PyObject *input_obj = (PyObject*)self;
-	const char *table1, *output_start, *del_table=NULL;
+	const char *output_start, *del_table=NULL;
 	Py_ssize_t inlen, tablen, dellen = 0;
 	PyObject *result;
 	int trans_table[256];
@@ -2358,9 +2358,13 @@
 		return NULL;
 
 	if (PyString_Check(tableobj)) {
-		table1 = PyString_AS_STRING(tableobj);
+		table = PyString_AS_STRING(tableobj);
 		tablen = PyString_GET_SIZE(tableobj);
 	}
+	else if (tableobj == Py_None) {
+		table = NULL;
+		tablen = 256;
+	}
 #ifdef Py_USING_UNICODE
 	else if (PyUnicode_Check(tableobj)) {
 		/* Unicode .translate() does not support the deletechars
@@ -2374,7 +2378,7 @@
 		return PyUnicode_Translate((PyObject *)self, tableobj, NULL);
 	}
 #endif
-	else if (PyObject_AsCharBuffer(tableobj, &table1, &tablen))
+	else if (PyObject_AsCharBuffer(tableobj, &table, &tablen))
 		return NULL;
 
 	if (tablen != 256) {
@@ -2403,7 +2407,6 @@
 		dellen = 0;
 	}
 
-	table = table1;
 	inlen = PyString_GET_SIZE(input_obj);
 	result = PyString_FromStringAndSize((char *)NULL, inlen);
 	if (result == NULL)
@@ -2411,7 +2414,7 @@
 	output_start = output = PyString_AsString(result);
 	input = PyString_AS_STRING(input_obj);
 
-	if (dellen == 0) {
+	if (dellen == 0 && table != NULL) {
 		/* If no deletions are required, use faster code */
 		for (i = inlen; --i >= 0; ) {
 			c = Py_CHARMASK(*input++);
@@ -2425,8 +2428,13 @@
 		return input_obj;
 	}
 
-	for (i = 0; i < 256; i++)
-		trans_table[i] = Py_CHARMASK(table[i]);
+	if (table == NULL) {
+		for (i = 0; i < 256; i++)
+			trans_table[i] = Py_CHARMASK(i);
+	} else {
+		for (i = 0; i < 256; i++)
+			trans_table[i] = Py_CHARMASK(table[i]);
+	}
 
 	for (i = 0; i < dellen; i++)
 		trans_table[(int) Py_CHARMASK(del_table[i])] = -1;


More information about the Python-checkins mailing list