diff options
-rw-r--r-- | Lib/test/test_opcodes.py | 6 | ||||
-rw-r--r-- | Python/ceval.c | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py index d7d1673a87..7985bf61a4 100644 --- a/Lib/test/test_opcodes.py +++ b/Lib/test/test_opcodes.py @@ -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) diff --git a/Python/ceval.c b/Python/ceval.c index d457fd5489..419ecfaaaa 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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); |