Skip to content

Commit e74f52b

Browse files
committed
namedtuple: Inherit unary/binary ops from tuple base class.
1 parent d86d22e commit e74f52b

4 files changed

Lines changed: 13 additions & 5 deletions

File tree

py/objnamedtuple.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ mp_obj_t mp_obj_new_namedtuple_type(qstr name, const char *fields) {
127127
o->base.name = name;
128128
o->base.print = namedtuple_print;
129129
o->base.make_new = namedtuple_make_new;
130-
// o->base.unary_op = ;
131-
// o->base.binary_op = ;
130+
o->base.unary_op = tuple_unary_op;
131+
o->base.binary_op = tuple_binary_op;
132132
o->base.load_attr = namedtuple_load_attr;
133133
o->base.store_attr = namedtuple_store_attr;
134134
o->base.bases_tuple = (mp_obj_t)&namedtuple_base_tuple;

py/objtuple.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ STATIC bool tuple_cmp_helper(int op, mp_obj_t self_in, mp_obj_t another_in) {
8686
return mp_seq_cmp_objs(op, self->items, self->len, another->items, another->len);
8787
}
8888

89-
STATIC mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
89+
mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
9090
mp_obj_tuple_t *self = self_in;
9191
switch (op) {
9292
case RT_UNARY_OP_BOOL: return MP_BOOL(self->len != 0);
@@ -95,7 +95,7 @@ STATIC mp_obj_t tuple_unary_op(int op, mp_obj_t self_in) {
9595
}
9696
}
9797

98-
STATIC mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
98+
mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
9999
mp_obj_tuple_t *o = lhs;
100100
switch (op) {
101101
case RT_BINARY_OP_SUBSCR:
@@ -116,7 +116,7 @@ STATIC mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
116116
}
117117
case RT_BINARY_OP_ADD:
118118
{
119-
if (!MP_OBJ_IS_TYPE(rhs, &tuple_type)) {
119+
if (!mp_obj_is_subclass_fast(mp_obj_get_type(rhs), (mp_obj_t)&tuple_type)) {
120120
return NULL;
121121
}
122122
mp_obj_tuple_t *p = rhs;

py/objtuple.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ typedef struct _mp_obj_tuple_t {
55
} mp_obj_tuple_t;
66

77
void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind);
8+
mp_obj_t tuple_unary_op(int op, mp_obj_t self_in);
9+
mp_obj_t tuple_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs);

tests/basics/namedtuple1.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55
#print(T)
66
t = T(1, 2)
77
print(t)
8+
print(t[0], t[1])
89
print(t.foo, t.bar)
910

11+
print(len(t))
12+
print(bool(t))
13+
print(t + t)
14+
print(t * 3)
15+
1016
print(isinstance(t, tuple))
1117

1218
try:

0 commit comments

Comments
 (0)