Author: Richard Emslie <[email protected]>
Branch:
Changeset: r66711:1da59029b78e
Date: 2013-08-31 13:27 +0100
http://bitbucket.org/pypy/pypy/changeset/1da59029b78e/
Log: update the rsplit in rpython's rstr implementation, and use it from
the std object. (necaris, rxe)
diff --git a/pypy/objspace/std/stringobject.py
b/pypy/objspace/std/stringobject.py
--- a/pypy/objspace/std/stringobject.py
+++ b/pypy/objspace/std/stringobject.py
@@ -254,34 +254,8 @@
def str_split__String_None_ANY(space, w_self, w_none, w_maxsplit=-1):
maxsplit = space.int_w(w_maxsplit)
- res = []
value = w_self._value
- length = len(value)
- i = 0
- while True:
- # find the beginning of the next word
- while i < length:
- if not value[i].isspace():
- break # found
- i += 1
- else:
- break # end of string, finished
-
- # find the end of the word
- if maxsplit == 0:
- j = length # take all the rest of the string
- else:
- j = i + 1
- while j < length and not value[j].isspace():
- j += 1
- maxsplit -= 1 # NB. if it's already < 0, it stays < 0
-
- # the word is value[i:j]
- res.append(value[i:j])
-
- # continue to look from the character following the space after the
word
- i = j + 1
-
+ res = split(value, maxsplit=maxsplit)
return space.newlist_str(res)
def str_split__String_String_ANY(space, w_self, w_by, w_maxsplit=-1):
@@ -296,37 +270,8 @@
def str_rsplit__String_None_ANY(space, w_self, w_none, w_maxsplit=-1):
maxsplit = space.int_w(w_maxsplit)
- res = []
value = w_self._value
- i = len(value)-1
- while True:
- # starting from the end, find the end of the next word
- while i >= 0:
- if not value[i].isspace():
- break # found
- i -= 1
- else:
- break # end of string, finished
-
- # find the start of the word
- # (more precisely, 'j' will be the space character before the word)
- if maxsplit == 0:
- j = -1 # take all the rest of the string
- else:
- j = i - 1
- while j >= 0 and not value[j].isspace():
- j -= 1
- maxsplit -= 1 # NB. if it's already < 0, it stays < 0
-
- # the word is value[j+1:i+1]
- j1 = j + 1
- assert j1 >= 0
- res.append(value[j1:i+1])
-
- # continue to look from the character before the space before the word
- i = j - 1
-
- res.reverse()
+ res = rsplit(value, maxsplit=maxsplit)
return space.newlist_str(res)
def str_rsplit__String_String_ANY(space, w_self, w_by, w_maxsplit=-1):
diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -87,7 +87,41 @@
@specialize.argtype(0)
-def rsplit(value, by, maxsplit=-1):
+def rsplit(value, by=None, maxsplit=-1):
+ if by is None:
+ res = []
+
+ i = len(value) - 1
+ while True:
+ # starting from the end, find the end of the next word
+ while i >= 0:
+ if not value[i].isspace():
+ break # found
+ i -= 1
+ else:
+ break # end of string, finished
+
+ # find the start of the word
+ # (more precisely, 'j' will be the space character before the word)
+ if maxsplit == 0:
+ j = -1 # take all the rest of the string
+ else:
+ j = i - 1
+ while j >= 0 and not value[j].isspace():
+ j -= 1
+ maxsplit -= 1 # NB. if it's already < 0, it stays < 0
+
+ # the word is value[j+1:i+1]
+ j1 = j + 1
+ assert j1 >= 0
+ res.append(value[j1:i+1])
+
+ # continue to look from the character before the space before the
word
+ i = j - 1
+
+ res.reverse()
+ return res
+
if isinstance(value, str):
assert isinstance(by, str)
else:
diff --git a/rpython/rlib/test/test_rstring.py
b/rpython/rlib/test/test_rstring.py
--- a/rpython/rlib/test/test_rstring.py
+++ b/rpython/rlib/test/test_rstring.py
@@ -42,6 +42,11 @@
assert rsplit('endcase test', 'test') == ['endcase ', '']
py.test.raises(ValueError, rsplit, "abc", '')
+def test_rsplit_None():
+ assert rsplit("") == []
+ assert rsplit(' a\ta\na b') == ['a', 'a', 'a', 'b']
+ assert rsplit(" a a ", maxsplit=1) == [' a', 'a']
+
def test_rsplit_unicode():
assert rsplit(u"a", u"a", 1) == [u'', u'']
assert rsplit(u" ", u" ", 1) == [u'', u'']
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit