Skip to content

Commit 8725dce

Browse files
committed
Issue 5176: special-case string formatting in BINARY_MODULO implementation. This shows a modest (1-3%) speed-up in templating systems, for example.
1 parent e9fb686 commit 8725dce

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

Lib/test/test_opcodes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ def test_compare_function_objects(self):
102102
g = eval('lambda a=1: None')
103103
self.assertNotEquals(f, g)
104104

105+
def test_modulo_of_string_subclasses(self):
106+
class MyString(str):
107+
def __mod__(self, value):
108+
return 42
109+
self.assertEqual(MyString() % 3, 42)
110+
105111

106112
def test_main():
107113
run_unittest(OpcodeTest)

Python/ceval.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
12831283
case BINARY_MODULO:
12841284
w = POP();
12851285
v = TOP();
1286-
x = PyNumber_Remainder(v, w);
1286+
if (PyString_CheckExact(v))
1287+
x = PyString_Format(v, w);
1288+
else
1289+
x = PyNumber_Remainder(v, w);
12871290
Py_DECREF(v);
12881291
Py_DECREF(w);
12891292
SET_TOP(x);

0 commit comments

Comments
 (0)