py/objstr: Fix handling of OP_MODULO with namedtuple.

This fix handles attrtuple as well, eg. os.uname().  A test case has been
added in basics/attrtuple2.py.

Fixes issue #16969.

Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
This commit is contained in:
Yoctopuce dev
2025-03-20 12:03:59 +01:00
committed by Damien George
parent 8faa6bafdc
commit 0d2c18c299
5 changed files with 33 additions and 5 deletions

View File

@@ -33,6 +33,7 @@
#include "py/objlist.h"
#include "py/runtime.h"
#include "py/cstack.h"
#include "py/objtuple.h"
#if MICROPY_PY_BUILTINS_STR_OP_MODULO
static mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_t *args, mp_obj_t dict);
@@ -357,8 +358,7 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i
mp_obj_t *args = &rhs_in;
size_t n_args = 1;
mp_obj_t dict = MP_OBJ_NULL;
if (mp_obj_is_type(rhs_in, &mp_type_tuple)) {
// TODO: Support tuple subclasses?
if (mp_obj_is_tuple_compatible(rhs_in)) {
mp_obj_tuple_get(rhs_in, &n_args, &args);
} else if (mp_obj_is_type(rhs_in, &mp_type_dict)) {
dict = rhs_in;

View File

@@ -31,9 +31,6 @@
#include "py/objtuple.h"
#include "py/runtime.h"
// type check is done on getiter method to allow tuple, namedtuple, attrtuple
#define mp_obj_is_tuple_compatible(o) (MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_obj_get_type(o), iter) == mp_obj_tuple_getiter)
/******************************************************************************/
/* tuple */

View File

@@ -61,4 +61,7 @@ void mp_obj_attrtuple_print_helper(const mp_print_t *print, const qstr *fields,
mp_obj_t mp_obj_new_attrtuple(const qstr *fields, size_t n, const mp_obj_t *items);
// type check is done on getiter method to allow tuple, namedtuple, attrtuple
#define mp_obj_is_tuple_compatible(o) (MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_obj_get_type(o), iter) == mp_obj_tuple_getiter)
#endif // MICROPY_INCLUDED_PY_OBJTUPLE_H