Merge pull request #2171 from qingshi163/dev2

Implement array __repr__
This commit is contained in:
Noah
2020-08-30 16:32:19 -05:00
committed by GitHub
2 changed files with 19 additions and 2 deletions

View File

@@ -497,8 +497,6 @@ class BaseTest:
b = array.array(self.typecode, a)
self.assertEqual(a, b)
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_repr(self):
a = array.array(self.typecode, 2*self.example)
self.assertEqual(a, eval(repr(a), {"array": array.array}))

View File

@@ -236,6 +236,20 @@ macro_rules! def_array_enum {
}
}
fn repr(&self, _vm: &VirtualMachine) -> PyResult<String> {
// we don't need ReprGuard here
let s = match self {
$(ArrayContentType::$n(v) => {
if v.is_empty() {
format!("array('{}')", $c)
} else {
format!("array('{}', [{}])", $c, v.iter().format(", "))
}
})*
};
Ok(s)
}
fn iter<'a>(&'a self, vm: &'a VirtualMachine) -> impl Iterator<Item = PyObjectRef> + 'a {
let mut i = 0;
std::iter::from_fn(move || {
@@ -443,6 +457,11 @@ impl PyArray {
self.borrow_value_mut().setitem(needle, obj, vm)
}
#[pymethod(name = "__repr__")]
fn repr(zelf: PyRef<Self>, vm: &VirtualMachine) -> PyResult<String> {
zelf.borrow_value().repr(vm)
}
#[pymethod(name = "__eq__")]
fn eq(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyComparisonValue> {
let lhs = self.borrow_value();