@@ -213,6 +213,26 @@ impl PyDictRef {
213
213
}
214
214
}
215
215
216
+ fn setdefault (
217
+ self ,
218
+ key : PyObjectRef ,
219
+ default : OptionalArg < PyObjectRef > ,
220
+ vm : & VirtualMachine ,
221
+ ) -> PyResult {
222
+ let mut entries = self . entries . borrow_mut ( ) ;
223
+ match entries. get ( vm, & key) ? {
224
+ Some ( value) => Ok ( value) ,
225
+ None => {
226
+ let set_value = match default {
227
+ OptionalArg :: Present ( value) => value,
228
+ OptionalArg :: Missing => vm. ctx . none ( ) ,
229
+ } ;
230
+ entries. insert ( vm, & key, set_value. clone ( ) ) ?;
231
+ Ok ( set_value)
232
+ }
233
+ }
234
+ }
235
+
216
236
fn copy ( self , _vm : & VirtualMachine ) -> PyDict {
217
237
PyDict {
218
238
entries : self . entries . clone ( ) ,
@@ -473,6 +493,7 @@ pub fn init(context: &PyContext) {
473
493
"items" => context. new_rustfunc( PyDictRef :: items) ,
474
494
"keys" => context. new_rustfunc( PyDictRef :: keys) ,
475
495
"get" => context. new_rustfunc( PyDictRef :: get) ,
496
+ "setdefault" => context. new_rustfunc( PyDictRef :: setdefault) ,
476
497
"copy" => context. new_rustfunc( PyDictRef :: copy) ,
477
498
"update" => context. new_rustfunc( PyDictRef :: update) ,
478
499
"pop" => context. new_rustfunc( PyDictRef :: pop) ,
0 commit comments