]> granicus.if.org Git - python/commitdiff
Issue 5176: special-case string formatting in BINARY_MODULO implementation. This...
authorCollin Winter <collinw@gmail.com>
Fri, 20 Feb 2009 19:30:41 +0000 (19:30 +0000)
committerCollin Winter <collinw@gmail.com>
Fri, 20 Feb 2009 19:30:41 +0000 (19:30 +0000)
Lib/test/test_opcodes.py
Python/ceval.c

index d7d1673a879acdffe231f90d759dad012e2adf4f..7985bf61a4d8956d4a67aed06dc0c947e5fded7e 100644 (file)
@@ -102,6 +102,12 @@ class OpcodeTest(unittest.TestCase):
         g = eval('lambda a=1: None')
         self.assertNotEquals(f, g)
 
+    def test_modulo_of_string_subclasses(self):
+        class MyString(str):
+            def __mod__(self, value):
+                return 42
+        self.assertEqual(MyString() % 3, 42)
+
 
 def test_main():
     run_unittest(OpcodeTest)
index d457fd5489483e4388d1e28348ecf74746d223cd..419ecfaaaaac53862a0aec91e4e54376abf94d2d 100644 (file)
@@ -1283,7 +1283,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                case BINARY_MODULO:
                        w = POP();
                        v = TOP();
-                       x = PyNumber_Remainder(v, w);
+                       if (PyString_CheckExact(v))
+                               x = PyString_Format(v, w);
+                       else
+                               x = PyNumber_Remainder(v, w);
                        Py_DECREF(v);
                        Py_DECREF(w);
                        SET_TOP(x);