Author: Armin Rigo <[email protected]>
Branch:
Changeset: r89390:bb49f0339d82
Date: 2017-01-06 13:09 +0100
http://bitbucket.org/pypy/pypy/changeset/bb49f0339d82/
Log: Fix ``"".replace("", "x", num)`` to give the same result as CPython
diff --git a/pypy/objspace/std/stringmethods.py
b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -548,6 +548,10 @@
sub = self._op_val(space, w_old)
by = self._op_val(space, w_new)
+ # the following two lines are for being bug-to-bug compatible
+ # with CPython: see issue #2448
+ if count >= 0 and len(input) == 0:
+ return self._empty()
try:
res = replace(input, sub, by, count)
except OverflowError:
diff --git a/pypy/objspace/std/test/test_bytesobject.py
b/pypy/objspace/std/test/test_bytesobject.py
--- a/pypy/objspace/std/test/test_bytesobject.py
+++ b/pypy/objspace/std/test/test_bytesobject.py
@@ -809,6 +809,16 @@
s = b"a" * (2**16)
raises(OverflowError, s.replace, b"", s)
+ def test_replace_issue2448(self):
+ # CPython's replace() method has a bug that makes
+ # ''.replace('', 'x') gives a different answer than
+ # ''.replace('', 'x', 1000). This is the case in all
+ # known versions, at least until 2.7.13. Some people
+ # call that a feature on the CPython issue report and
+ # the discussion dies out, so it might never be fixed.
+ assert ''.replace('', 'x') == 'x'
+ assert ''.replace('', 'x', 1000) == ''
+
def test_getslice(self):
assert "foobar".__getslice__(4, 4321) == "ar"
s = b"abc"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit