Skip to content

Commit 42e45bd

Browse files
Jongydpgeorge
authored andcommitted
py/objobject: Add object.__delattr__ function.
Similar to object.__setattr__.
1 parent 07ccb55 commit 42e45bd

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

py/objobject.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,23 @@ STATIC mp_obj_t object___setattr__(mp_obj_t self_in, mp_obj_t attr, mp_obj_t val
7777
return mp_const_none;
7878
}
7979
STATIC MP_DEFINE_CONST_FUN_OBJ_3(object___setattr___obj, object___setattr__);
80+
81+
STATIC mp_obj_t object___delattr__(mp_obj_t self_in, mp_obj_t attr) {
82+
if (!mp_obj_is_instance_type(mp_obj_get_type(MP_OBJ_TO_PTR(self_in)))) {
83+
mp_raise_TypeError("arg must be user-type");
84+
}
85+
86+
if (!mp_obj_is_str(attr)) {
87+
mp_raise_TypeError(NULL);
88+
}
89+
90+
mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in);
91+
if (mp_map_lookup(&self->members, attr, MP_MAP_LOOKUP_REMOVE_IF_FOUND) == NULL) {
92+
mp_raise_msg(&mp_type_AttributeError, "no such attribute");
93+
}
94+
return mp_const_none;
95+
}
96+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(object___delattr___obj, object___delattr__);
8097
#endif
8198

8299
STATIC const mp_rom_map_elem_t object_locals_dict_table[] = {
@@ -88,6 +105,7 @@ STATIC const mp_rom_map_elem_t object_locals_dict_table[] = {
88105
#endif
89106
#if MICROPY_PY_DELATTR_SETATTR
90107
{ MP_ROM_QSTR(MP_QSTR___setattr__), MP_ROM_PTR(&object___setattr___obj) },
108+
{ MP_ROM_QSTR(MP_QSTR___delattr__), MP_ROM_PTR(&object___delattr___obj) },
91109
#endif
92110
};
93111

tests/basics/class_delattr_setattr.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ def __init__(self):
6969
def __setattr__(self, attr, value):
7070
print(attr, "=", value)
7171

72+
def __delattr__(self, attr):
73+
print("del", attr)
74+
7275
c = C()
7376
c.a = 5
7477
try:
@@ -86,3 +89,25 @@ def __setattr__(self, attr, value):
8689
object.__setattr__(c, 5, 5)
8790
except TypeError:
8891
print("TypeError")
92+
93+
94+
# test object.__delattr__
95+
del c.a
96+
print(c.a)
97+
98+
object.__delattr__(c, "a")
99+
try:
100+
print(c.a)
101+
except AttributeError:
102+
print("AttributeError")
103+
104+
super(C, c).__delattr__("b")
105+
try:
106+
print(c.b)
107+
except AttributeError:
108+
print("AttributeError")
109+
110+
try:
111+
object.__delattr__(c, "c")
112+
except AttributeError:
113+
print("AttributeError")

0 commit comments

Comments
 (0)