Skip to content

Commit c1832fd

Browse files
stinosdpgeorge
authored andcommitted
py: Add setattr builtin.
1 parent aa73062 commit c1832fd

4 files changed

Lines changed: 23 additions & 7 deletions

File tree

py/builtin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_eval_obj);
4848
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_exec_obj);
4949
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_execfile_obj);
5050
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_getattr_obj);
51+
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_setattr_obj);
5152
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_globals_obj);
5253
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_hasattr_obj);
5354
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_hash_obj);

py/modbuiltins.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -534,20 +534,20 @@ STATIC inline mp_obj_t mp_load_attr_default(mp_obj_t base, qstr attr, mp_obj_t d
534534
}
535535

536536
STATIC mp_obj_t mp_builtin_getattr(mp_uint_t n_args, const mp_obj_t *args) {
537-
mp_obj_t attr = args[1];
538-
if (MP_OBJ_IS_TYPE(attr, &mp_type_str)) {
539-
attr = mp_obj_str_intern(attr);
540-
} else if (!MP_OBJ_IS_QSTR(attr)) {
541-
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "string required"));
542-
}
543537
mp_obj_t defval = MP_OBJ_NULL;
544538
if (n_args > 2) {
545539
defval = args[2];
546540
}
547-
return mp_load_attr_default(args[0], MP_OBJ_QSTR_VALUE(attr), defval);
541+
return mp_load_attr_default(args[0], mp_obj_str_get_qstr(args[1]), defval);
548542
}
549543
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_getattr_obj, 2, 3, mp_builtin_getattr);
550544

545+
STATIC mp_obj_t mp_builtin_setattr(mp_obj_t base, mp_obj_t attr, mp_obj_t value) {
546+
mp_store_attr(base, mp_obj_str_get_qstr(attr), value);
547+
return mp_const_none;
548+
}
549+
MP_DEFINE_CONST_FUN_OBJ_3(mp_builtin_setattr_obj, mp_builtin_setattr);
550+
551551
STATIC mp_obj_t mp_builtin_hasattr(mp_obj_t object_in, mp_obj_t attr_in) {
552552
assert(MP_OBJ_IS_QSTR(attr_in));
553553

@@ -637,6 +637,7 @@ STATIC const mp_map_elem_t mp_module_builtins_globals_table[] = {
637637
{ MP_OBJ_NEW_QSTR(MP_QSTR_execfile), (mp_obj_t)&mp_builtin_execfile_obj },
638638
#endif
639639
{ MP_OBJ_NEW_QSTR(MP_QSTR_getattr), (mp_obj_t)&mp_builtin_getattr_obj },
640+
{ MP_OBJ_NEW_QSTR(MP_QSTR_setattr), (mp_obj_t)&mp_builtin_setattr_obj },
640641
{ MP_OBJ_NEW_QSTR(MP_QSTR_globals), (mp_obj_t)&mp_builtin_globals_obj },
641642
{ MP_OBJ_NEW_QSTR(MP_QSTR_hasattr), (mp_obj_t)&mp_builtin_hasattr_obj },
642643
{ MP_OBJ_NEW_QSTR(MP_QSTR_hash), (mp_obj_t)&mp_builtin_hash_obj },

py/qstrdefs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ Q(float)
185185
#endif
186186
Q(from_bytes)
187187
Q(getattr)
188+
Q(setattr)
188189
Q(globals)
189190
Q(hasattr)
190191
Q(hash)

tests/basics/setattr1.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class A:
2+
3+
var = 132
4+
5+
def __init__(self):
6+
self.var2 = 34
7+
8+
9+
a = A()
10+
setattr(a, "var", 123)
11+
setattr(a, "var2", 56)
12+
print(a.var)
13+
print(a.var2)

0 commit comments

Comments
 (0)