<div dir="auto"><div class="gmail_quote" dir="auto"><div dir="ltr">On Tue, Jan 29, 2019, 12:22 AM Brendan Barnwell </div><div dir="ltr"><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> <span style="font-family:sans-serif"> What would you expect to</span> happen with this line:<br>
><br>
> ['foo', b'foo', 37, re.compile('foo')].join('_')<br>
<br>
        That problem already exists with str.join though.  It's just currently spelled this way:<br>
<br>
','.join(['foo', b'foo', 37, re.compile('foo')])<br>
<br>
        . . . and the result is an error.  I don't see how it's semantically <br>
any less sensible to call list.join on a list of non-string things than <br>
it is to pass a list of non-string things to str.join.</blockquote></div><div dir="auto"><br></div><div dir="auto">This feels like an important asymmetry to me. There is a difference between to object itself being the wrong kind of thing and the arguments to a method being wrong.</div><div dir="auto"><br></div><div dir="auto">In the first case, the object (a heterogenous list) can NEVER support a .join() method. It's simply the wrong kind of object. Of course, it's right as far as the basic type system goes, but its deeper (maybe "structural") type cannot support that method.</div><div dir="auto"><br></div><div dir="auto">On the other hand, sure, almost any function, including methods, will choke on bad arguments. But no string *object* rules out joining if good arguments can be found.</div><div dir="auto"><br></div><div dir="auto">I am sure readers will immediately reply, "what about list.sort()?" Unfortunately, that really will simply fail on lists of the wrong "type." After all these years, I still think that change in Python 2.3 or so was the wrong choice (for those with fewer gray hairs: when the hills were young, Python objects were arbitrarily comparable under inequality, even when the answer didn't "mean" anything).</div><div dir="auto"><br></div><div dir="auto">I actually agree that a 'cast_to_string_and_join()' function sounds useful. Of course, you can write one easily enough, it doesn't need to be a method. For that matter, I think I'd probably rather that str.join() was simply a function in the string module or somewhere similar, with a signature like 'join(delim, iter_of_strings)'</div></div>