From d8f3a532202a9cee7e28ac99e3338810a0afedbc Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sun, 24 Sep 2023 19:44:15 +0800 Subject: [PATCH] ... --- src/pocketpy.cpp | 13 +++++++++++-- tests/07_dict.py | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 6660eba0..21f47947 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1188,10 +1188,19 @@ void init_builtins(VM* _vm) { if(!ok) vm->KeyError(key); }); - _vm->bind_method<1>("dict", "pop", [](VM* vm, ArgsView args) { + _vm->bind_method<-1>("dict", "pop", [](VM* vm, ArgsView args) { + if(args.size() != 2 && args.size() != 3){ + vm->TypeError("pop() expected 1 or 2 arguments"); + return vm->None; + } Dict& self = _CAST(Dict&, args[0]); PyObject* value = self.try_get(args[1]); - if(value == nullptr) vm->KeyError(args[1]); + if(value == nullptr){ + if(args.size() == 2) vm->KeyError(args[1]); + if(args.size() == 3){ + return args[2]; + } + } self.erase(args[1]); return value; }); diff --git a/tests/07_dict.py b/tests/07_dict.py index f9c02da5..2721c1a9 100644 --- a/tests/07_dict.py +++ b/tests/07_dict.py @@ -125,4 +125,20 @@ for i in range(len(data)): b.append(z) if i % 3 == 0: y = b.pop() - del a[y] \ No newline at end of file + del a[y] + +a = {1: 2, 3: 4} +assert a.pop(1) == 2 +try: + a.pop(1) + exit(1) +except KeyError: + pass + +assert a.pop(1, None) is None + +try: + a.pop(1, 2, 3) + exit(1) +except TypeError: + pass