Skip to content

Commit 06437e2

Browse files
committed
removeprefix, suffix: implementation for bytes and bytes array
1 parent eeb6cea commit 06437e2

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

Lib/test/string_tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,8 @@ def test_replace_overflow(self):
681681
self.checkraises(OverflowError, A2_16, "replace", "A", A2_16)
682682
self.checkraises(OverflowError, A2_16, "replace", "AA", A2_16+A2_16)
683683

684+
685+
# Python 3.9
684686
def test_removeprefix(self):
685687
self.checkequal('am', 'spam', 'removeprefix', 'sp')
686688
self.checkequal('spamspam', 'spamspamspam', 'removeprefix', 'spam')
@@ -699,6 +701,7 @@ def test_removeprefix(self):
699701
self.checkraises(TypeError, 'hello', 'removeprefix', 'h', 42)
700702
self.checkraises(TypeError, 'hello', 'removeprefix', ("he", "l"))
701703

704+
# Python 3.9
702705
def test_removesuffix(self):
703706
self.checkequal('sp', 'spam', 'removesuffix', 'am')
704707
self.checkequal('spamspam', 'spamspamspam', 'removesuffix', 'spam')

vm/src/obj/objbytearray.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,26 @@ impl PyByteArray {
389389
self.borrow_value().rstrip(chars).into()
390390
}
391391

392+
#[pymethod(name = "removeprefix")]
393+
fn removeprefix(&self, prefix: PyByteInner) -> PyByteArray {
394+
let value = self.borrow_value();
395+
if value.elements.starts_with(&prefix.elements) {
396+
return value.elements[prefix.elements.len()..].to_vec().into();
397+
}
398+
value.elements.to_vec().into()
399+
}
400+
401+
#[pymethod(name = "removesuffix")]
402+
fn removesuffix(&self, suffix: PyByteInner) -> PyByteArray {
403+
let value = self.borrow_value();
404+
if value.elements.ends_with(&suffix.elements) {
405+
return value.elements[..value.elements.len() - suffix.elements.len()]
406+
.to_vec()
407+
.into();
408+
}
409+
value.elements.to_vec().into()
410+
}
411+
392412
#[pymethod(name = "split")]
393413
fn split(&self, options: ByteInnerSplitOptions, vm: &VirtualMachine) -> PyResult {
394414
self.borrow_value()

vm/src/obj/objbyteinner.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,22 @@ impl PyByteInner {
843843
.to_vec()
844844
}
845845

846+
// new in Python 3.9
847+
pub fn removeprefix(&self, prefix: PyByteInner) -> Vec<u8> {
848+
if self.elements.starts_with(&prefix.elements) {
849+
return self.elements[prefix.elements.len()..].to_vec();
850+
}
851+
self.elements.to_vec()
852+
}
853+
854+
// new in Python 3.9
855+
pub fn removesuffix(&self, suffix: PyByteInner) -> Vec<u8> {
856+
if self.elements.ends_with(&suffix.elements) {
857+
return self.elements[..self.elements.len() - suffix.elements.len()].to_vec();
858+
}
859+
self.elements.to_vec()
860+
}
861+
846862
pub fn split<F>(
847863
&self,
848864
options: ByteInnerSplitOptions,

vm/src/obj/objbytes.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,16 @@ impl PyBytes {
347347
self.inner.rstrip(chars).into()
348348
}
349349

350+
#[pymethod(name = "removeprefix")]
351+
fn removeprefix(&self, prefix: PyByteInner) -> PyBytes {
352+
self.inner.removeprefix(prefix).into()
353+
}
354+
355+
#[pymethod(name = "removesuffix")]
356+
fn removesuffix(&self, suffix: PyByteInner) -> PyBytes {
357+
self.inner.removesuffix(suffix).into()
358+
}
359+
350360
#[pymethod(name = "split")]
351361
fn split(&self, options: ByteInnerSplitOptions, vm: &VirtualMachine) -> PyResult {
352362
self.inner

0 commit comments

Comments
 (0)