Custom string joining

Martineau ggrp2.20.martineau at dfgh.net
Mon May 9 17:38:24 EDT 2011


On May 9, 1:25 pm, Claudiu Popa <cp... at bitdefender.com> wrote:
> Hello Karim,
>
> > You just have to implement __str__() python special method for your
> > "custom_objects".
> > Regards
> > Karim
> >> Cheers,
> >> Chris
> >> --
> >>http://rebertia.com
>
> I  already told in the first post that I've implemented __str__ function, but it doesn't
> seems to be automatically called.
> For instance, the following example won't work:
>
> >>> class a:
>
>         def __init__(self, i):
>                 self.i = i
>         def __str__(self):
>                 return "magic_function_{}".format(self.i)>>> t = a(0)
> >>> str(t)
> 'magic_function_0'
> >>> "".join([t])
>
> Traceback (most recent call last):
>   File "<pyshell#13>", line 1, in <module>
>     "".join([t])
> TypeError: sequence item 0: expected str instance, a found
>
> --
> Best regards,
>  Claudiu

The built-in str join() method just doesn't do the conversion to
string automatically -- instead it assume it has been given a sequence
of string. You can achieve the effect you want by modifying the
optimized version of my earlier post that @Ian Kelly submitted.

def join(seq, sep):
    it = iter(seq)
    sep = str(sep)
    try:
        first = it.next()
    except StopIteration:
        return []
    def add_sep(r, v):
        r += [sep, str(v)]
        return r
    return ''.join(reduce(add_sep, it, [str(first)]))

class A:
    def __init__(self, i):
        self.i = i
    def __str__(self):
        return "magic_function_{}".format(self.i)

lst = [A(0),A(1),A('b'),A(3)]

print repr( join(lst, '|') )

Output:

'magic_function_0|magic_function_1|magic_function_b|magic_function_3'



More information about the Python-list mailing list