diff --git a/builtin/builtin.go b/builtin/builtin.go index af47833f..a984928a 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -29,7 +29,7 @@ func init() { // py.MustNewMethod("callable", builtin_callable, 0, callable_doc), py.MustNewMethod("chr", builtin_chr, 0, chr_doc), py.MustNewMethod("compile", builtin_compile, 0, compile_doc), - // py.MustNewMethod("delattr", builtin_delattr, 0, delattr_doc), + py.MustNewMethod("delattr", builtin_delattr, 0, delattr_doc), // py.MustNewMethod("dir", builtin_dir, 0, dir_doc), py.MustNewMethod("divmod", builtin_divmod, 0, divmod_doc), py.MustNewMethod("eval", py.InternalMethodEval, 0, eval_doc), @@ -633,6 +633,27 @@ func source_as_string(cmd py.Object, funcname, what string /*, PyCompilerFlags * // return nil; } +const delattr_doc = `Deletes the named attribute from the given object. + +delattr(x, 'y') is equivalent to "del x.y" +` + +func builtin_delattr(self py.Object, args py.Tuple) (py.Object, error) { + var v py.Object + var name py.Object + + err := py.UnpackTuple(args, nil, "delattr", 2, 2, &v, &name) + if err != nil { + return nil, err + } + + err = py.DeleteAttr(v, name) + if err != nil { + return nil, err + } + return py.None, nil +} + const compile_doc = `compile(source, filename, mode[, flags[, dont_inherit]]) -> code object Compile the source string (a Python module, statement or expression) diff --git a/builtin/tests/builtin.py b/builtin/tests/builtin.py index ac3f7dc1..1349c891 100644 --- a/builtin/tests/builtin.py +++ b/builtin/tests/builtin.py @@ -300,6 +300,15 @@ class C: pass setattr(c, "potato", "spud") assert getattr(c, "potato") == "spud" assert c.potato == "spud" +delattr(c, "potato") +assert not hasattr(c, "potato") +ok = False +try: + delattr(c, "potato") +except AttributeError as e: + ok = True +finally: + assert ok doc="sum" assert sum([1,2,3]) == 6