I know I'm not on this team any more .... but I still get these messages and just had to respond.  While those articles do address the asymptotic behavior of various string concatenation options, in practice, constants matter:

In [11]: client = 'blah'

In [12]: %timeit '/users/' + client + '/credentials/ssh2'
10000000 loops, best of 3: 136 ns per loop

In [13]: %timeit '/'.join(('/users', client, 'credentials/ssh2'))
1000000 loops, best of 3: 197 ns per loop

In [14]: %timeit '/users/%s/credentials/ssh2' % client
10000000 loops, best of 3: 149 ns per loop

... so in this case, the function call and implicit tuple creation in the join call overshadow the cost of the additional memory allocations.   Anyway, hope all is going well!  Also, @bd4, I too will miss the % operator.