diff --git a/py/objreversed.c b/py/objreversed.c index 4ddb21807464..0d5332d002ee 100644 --- a/py/objreversed.c +++ b/py/objreversed.c @@ -39,6 +39,13 @@ typedef struct _mp_obj_reversed_t { STATIC mp_obj_t reversed_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); + // check if __reversed__ exists, and if so delegate to it + mp_obj_t dest[2]; + mp_load_method_maybe(args[0], MP_QSTR___reversed__, dest); + if (dest[0] != MP_OBJ_NULL) { + return mp_call_method_n_kw(0, 0, dest); + } + mp_obj_reversed_t *o = m_new_obj(mp_obj_reversed_t); o->base.type = type_in; o->seq = args[0]; diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 71a523c2d692..23c25072d943 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -74,6 +74,7 @@ Q(__gt__) Q(__eq__) Q(__le__) Q(__ge__) +Q(__reversed__) Q(micropython) Q(bytecode) diff --git a/tests/basics/builtin_reversed.py b/tests/basics/builtin_reversed.py index 58631d544359..f129a4f5d5f6 100644 --- a/tests/basics/builtin_reversed.py +++ b/tests/basics/builtin_reversed.py @@ -31,3 +31,9 @@ def __getitem__(self, pos): return pos + 1 for a in reversed(A()): print(a) + +# user object with __reversed__ +class B: + def __reversed__(self): + return [1, 2, 3] +print(reversed(B()))