Kaynağa Gözat

add `dict.pop`

blueloveTH 2 yıl önce
ebeveyn
işleme
940159e1ab
3 değiştirilmiş dosya ile 16 ekleme ve 1 silme
  1. 2 0
      python/collections.py
  2. 8 0
      src/pocketpy.h
  3. 6 1
      tests/07_dict.py

+ 2 - 0
python/collections.py

@@ -117,3 +117,5 @@ class defaultdict:
     def items(self):
         return self._a.items()
 
+    def pop(self, key):
+        return self._a.pop(key)

+ 8 - 0
src/pocketpy.h

@@ -898,6 +898,14 @@ inline void init_builtins(VM* _vm) {
         self.erase(key);
     });
 
+    _vm->bind_method<1>("dict", "pop", [](VM* vm, ArgsView args) {
+        Dict& self = _CAST(Dict&, args[0]);
+        PyObject* value = self.try_get(args[1]);
+        if(value == nullptr) vm->KeyError(args[1]);
+        self.erase(args[1]);
+        return value;
+    });
+
     _vm->bind__contains__(_vm->tp_dict, [](VM* vm, PyObject* obj, PyObject* key) {
         Dict& self = _CAST(Dict&, obj);
         return self.contains(key);

+ 6 - 1
tests/07_dict.py

@@ -47,4 +47,9 @@ assert d1 == d2
 assert d1 != d3
 
 a = dict([(1, 2), (3, 4)])
-assert a == {1: 2, 3: 4}
+assert a == {1: 2, 3: 4}
+
+assert a.pop(1) == 2
+assert a == {3: 4}
+assert a.pop(3) == 4
+assert a == {}