From 7cd9edcd0aea3f4608f7578dfeab7603e4619043 Mon Sep 17 00:00:00 2001 From: stijn Date: Tue, 23 Dec 2014 14:06:55 +0100 Subject: [PATCH] py: Implement __dict__ for instances Note that even though wrapped in MICROPY_CPYTHON_COMPAT, it is not fully compatible because the modifications to the dictionary do not propagate to the actual instance members. --- py/objtype.c | 17 ++++++++++++++++- py/qstrdefs.h | 1 + tests/basics/builtin_dict.py | 11 +++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/basics/builtin_dict.py diff --git a/py/objtype.c b/py/objtype.c index db99d407acfcd..b1fc347579b48 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -472,7 +472,22 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des dest[0] = elem->value; return; } - +#if MICROPY_CPYTHON_COMPAT + if (attr == MP_QSTR___dict__) { + // Create a new dict with a copy of the instance's map items. + // This creates, unlike CPython, a 'read-only' __dict__: modifying + // it will not result in modifications to the actual instance members. + mp_map_t *map = &(self->members); + mp_obj_t attr_dict = mp_obj_new_dict(0); + for (mp_uint_t i = 0; i < map->alloc; ++i) { + if (MP_MAP_SLOT_IS_FILLED(map, i)) { + mp_obj_dict_store(attr_dict, map->table[i].key, map->table[i].value); + } + } + dest[0] = attr_dict; + return; + } +#endif struct class_lookup_data lookup = { .obj = self, .attr = attr, diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 483c7537747c6..5efa9aa3bace3 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -46,6 +46,7 @@ Q(__locals__) Q(__main__) Q(__module__) Q(__name__) +Q(__dict__) Q(__hash__) Q(__next__) Q(__qualname__) diff --git a/tests/basics/builtin_dict.py b/tests/basics/builtin_dict.py new file mode 100644 index 0000000000000..f51ec21d007ae --- /dev/null +++ b/tests/basics/builtin_dict.py @@ -0,0 +1,11 @@ +class A: + def __init__(self): + self.a=1 + self.b=2 + +try: + d=A().__dict__ + print(d['a']) + print(d['b']) +except AttributeError: + print("SKIP") pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy