Skip to content

Commit 962a5d5

Browse files
committed
py: Implement __reversed__ slot.
Addresses issue adafruit#1073.
1 parent d7f1994 commit 962a5d5

3 files changed

Lines changed: 14 additions & 0 deletions

File tree

py/objreversed.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ typedef struct _mp_obj_reversed_t {
3939
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) {
4040
mp_arg_check_num(n_args, n_kw, 1, 1, false);
4141

42+
// check if __reversed__ exists, and if so delegate to it
43+
mp_obj_t dest[2];
44+
mp_load_method_maybe(args[0], MP_QSTR___reversed__, dest);
45+
if (dest[0] != MP_OBJ_NULL) {
46+
return mp_call_method_n_kw(0, 0, dest);
47+
}
48+
4249
mp_obj_reversed_t *o = m_new_obj(mp_obj_reversed_t);
4350
o->base.type = type_in;
4451
o->seq = args[0];

py/qstrdefs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Q(__gt__)
7474
Q(__eq__)
7575
Q(__le__)
7676
Q(__ge__)
77+
Q(__reversed__)
7778

7879
Q(micropython)
7980
Q(bytecode)

tests/basics/builtin_reversed.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ def __getitem__(self, pos):
3131
return pos + 1
3232
for a in reversed(A()):
3333
print(a)
34+
35+
# user object with __reversed__
36+
class B:
37+
def __reversed__(self):
38+
return [1, 2, 3]
39+
print(reversed(B()))

0 commit comments

Comments
 (0)