From cf11f5aeeaf1f6fbbb0e47876cb7077f56365d82 Mon Sep 17 00:00:00 2001 From: Jack-R-lantern Date: Sat, 9 Oct 2021 15:58:24 +0900 Subject: [PATCH] Add __contains__ in dict_items --- vm/src/builtins/dict.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index c04332d692..c77bc2b6fd 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -3,6 +3,7 @@ use super::{ PyTypeRef, }; use crate::{ + builtins::PyTupleRef, common::ascii, dictdatatype::{self, DictKey}, function::{ArgIterable, FuncArgs, IntoPyObject, KwArgs, OptionalArg}, @@ -926,6 +927,24 @@ impl PyDictItems { let inner = zelf.symmetric_difference(other, vm)?; Ok(PySet { inner }) } + + #[pymethod(magic)] + fn contains(zelf: PyRef, needle: PyTupleRef, vm: &VirtualMachine) -> PyResult { + if needle.len() != 2 { + return Ok(false); + } + let key = needle.fast_getitem(0); + let found = zelf.dict().contains(key.clone(), vm).unwrap(); + if found == false { + return Ok(false); + } + let value = needle.fast_getitem(1); + let found = PyDict::getitem(zelf.dict().clone(), key, vm).unwrap(); + if !vm.identical_or_equal(&found, &value)? { + return Ok(false); + } + Ok(true) + } } pub(crate) fn init(context: &PyContext) {