Skip to content

Commit a157e4c

Browse files
committed
py: str.join can now take arbitrary iterable as argument.
1 parent 13d6739 commit a157e4c

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

py/objstr.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,17 +329,19 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
329329
mp_obj_t *seq_items;
330330
if (MP_OBJ_IS_TYPE(arg, &mp_type_tuple)) {
331331
mp_obj_tuple_get(arg, &seq_len, &seq_items);
332-
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_list)) {
333-
mp_obj_list_get(arg, &seq_len, &seq_items);
334332
} else {
335-
goto bad_arg;
333+
if (!MP_OBJ_IS_TYPE(arg, &mp_type_list)) {
334+
// arg is not a list, try to convert it to one
335+
arg = mp_type_list.make_new((mp_obj_t)&mp_type_list, 1, 0, &arg);
336+
}
337+
mp_obj_list_get(arg, &seq_len, &seq_items);
336338
}
337339

338340
// count required length
339341
int required_len = 0;
340342
for (int i = 0; i < seq_len; i++) {
341343
if (!MP_OBJ_IS_STR(seq_items[i])) {
342-
goto bad_arg;
344+
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "join expected a list of str's"));
343345
}
344346
if (i > 0) {
345347
required_len += sep_len;
@@ -363,9 +365,6 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
363365

364366
// return joined string
365367
return mp_obj_str_builder_end(joined_str);
366-
367-
bad_arg:
368-
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "?str.join expecting a list of str's"));
369368
}
370369

371370
#define is_ws(c) ((c) == ' ' || (c) == '\t')

tests/basics/string-join.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
print(','.join(()))
2+
print(','.join(('a',)))
3+
print(','.join(('a', 'b')))
4+
5+
print(','.join([]))
6+
print(','.join(['a']))
7+
print(','.join(['a', 'b']))
8+
9+
print(''.join(''))
10+
print(''.join('abc'))
11+
print(','.join('abc'))
12+
print(','.join('abc' for i in range(5)))

0 commit comments

Comments
 (0)