summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorchrysn <chrysn@fsfe.org>2016-01-13 12:29:17 +0100
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-01-14 21:15:18 +0200
commitf8ba2eca804ae167d6597cc89eb270ddd8e1ce23 (patch)
tree49f6143c77a0dd90c493b922bcaee689958526fb /py
parentdea585f8ae71be75021e8a9513278c04e4d6a423 (diff)
downloadmicropython-f8ba2eca804ae167d6597cc89eb270ddd8e1ce23.tar.gz
micropython-f8ba2eca804ae167d6597cc89eb270ddd8e1ce23.zip
builtin property: accept keyword arguments
this allows python code to use property(lambda:..., doc=...) idiom. named versions for the fget, fset and fdel arguments are left out in the interest of saving space; they are rarely used and easy to enable when actually needed. a test case is included.
Diffstat (limited to 'py')
-rw-r--r--py/objproperty.c32
-rw-r--r--py/qstrdefs.h1
2 files changed, 14 insertions, 19 deletions
diff --git a/py/objproperty.c b/py/objproperty.c
index 80e39e0933..e7e9a5d714 100644
--- a/py/objproperty.c
+++ b/py/objproperty.c
@@ -38,28 +38,22 @@ typedef struct _mp_obj_property_t {
} mp_obj_property_t;
STATIC mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
- mp_arg_check_num(n_args, n_kw, 0, 4, false);
+ enum { ARG_fget, ARG_fset, ARG_fdel, ARG_doc };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
+ { MP_QSTR_, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
+ { MP_QSTR_, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
+ { MP_QSTR_doc, MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
+ };
+ mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals);
mp_obj_property_t *o = m_new_obj(mp_obj_property_t);
o->base.type = type;
- if (n_args >= 4) {
- // doc ignored
- }
- if (n_args >= 3) {
- o->proxy[2] = args[2];
- } else {
- o->proxy[2] = mp_const_none;
- }
- if (n_args >= 2) {
- o->proxy[1] = args[1];
- } else {
- o->proxy[1] = mp_const_none;
- }
- if (n_args >= 1) {
- o->proxy[0] = args[0];
- } else {
- o->proxy[0] = mp_const_none;
- }
+ o->proxy[0] = vals[ARG_fget].u_obj;
+ o->proxy[1] = vals[ARG_fset].u_obj;
+ o->proxy[2] = vals[ARG_fdel].u_obj;
+ // vals[ARG_doc] is silently discarded
return MP_OBJ_FROM_PTR(o);
}
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 496896dad4..50f2b3b385 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -570,6 +570,7 @@ Q(property)
Q(getter)
Q(setter)
Q(deleter)
+Q(doc)
#endif
#if MICROPY_PY_UZLIB