diff --git a/py/dict.go b/py/dict.go index 10c2d33f..f0aa938c 100644 --- a/py/dict.go +++ b/py/dict.go @@ -189,6 +189,19 @@ func (d StringDict) M__getitem__(key Object) (Object, error) { return nil, ExceptionNewf(KeyError, "%v", key) } +func (d StringDict) M__delitem__(key Object) (Object, error) { + str, ok := key.(String) + if !ok { + return nil, ExceptionNewf(KeyError, "%v", key) + } + _, ok = d[string(str)] + if !ok { + return nil, ExceptionNewf(KeyError, "%v", key) + } + delete(d, string(str)) + return None, nil +} + func (d StringDict) M__setitem__(key, value Object) (Object, error) { str, ok := key.(String) if !ok { diff --git a/py/tests/dict.py b/py/tests/dict.py index d6140e47..8fc9619e 100644 --- a/py/tests/dict.py +++ b/py/tests/dict.py @@ -46,6 +46,16 @@ assert v == 5.5 assertRaises(TypeError, a.items, 'a') +doc="del" +a = {'hello': 'world', 'hi': 'there'} +del a["hello"] +def doDel(d, key): + del d[key] +assertRaises(KeyError, lambda: doDel(a, "bob")) +assertRaises(KeyError, lambda: doDel(a, 123)) +assert not a.__contains__('hello') +assert a.__contains__('hi') + doc="__contain__" a = {'hello': 'world'} assert a.__contains__('hello')