Reputation: 9428
We know that formatting one argument can be done using one %s
in a string:
>>> "Hello %s" % "world"
'Hello world'
for two arguments, we can use two %s
(duh!):
>>> "Hello %s, %s" % ("John", "Joe")
'Hello John, Joe'
So, how can I format a variable number of arguments without having to explicitly define within the base string a number of %s
equal to the number of arguments to format? it would be very cool if something like this exists:
>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary")
Hello JohnJoeMary
>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary", "Rick", "Sophie")
Hello JohnJoeMaryRickSophie
Is this even possible or the only thing I could do about it is to do something like:
>>> my_args = ["John", "Joe", "Mary"]
>>> my_str = "Hello " + ("".join(["%s"] * len(my_args)))
>>> my_str % tuple(my_args)
"Hello JohnJoeMary"
NOTE: I need to do it with the %s
string formatting operator.
UPDATE:
It needs to be with the %s
because a function from another library formats my string using that operator given that I pass the unformatted string and the args to format it, but it makes some checking and corrections (if needed) on the args before actually making the formatting.
So I need to call it:
>>> function_in_library("Hello <cool_operator_here>", ["John", "Joe", "Mary"])
"Hello JohnJoeMary"
Thanks for your help!
Upvotes: 23
Views: 29477
Reputation: 1124998
You'd use str.join()
on the list without string formatting, then interpolate the result:
"Hello %s" % ', '.join(my_args)
Demo:
>>> my_args = ["foo", "bar", "baz"]
>>> "Hello %s" % ', '.join(my_args)
'Hello foo, bar, baz'
If some of your arguments are not yet strings, use a list comprehension:
>>> my_args = ["foo", "bar", 42]
>>> "Hello %s" % ', '.join([str(e) for e in my_args])
'Hello foo, bar, 42'
or use map(str, ...)
:
>>> "Hello %s" % ', '.join(map(str, my_args))
'Hello foo, bar, 42'
You'd do the same with your function:
function_in_library("Hello %s", ', '.join(my_args))
If you are limited by a (rather arbitrary) restriction that you cannot use a join
in the interpolation argument list, use a join
to create the formatting string instead:
function_in_library("Hello %s" % ', '.join(['%s'] * len(my_args)), my_args)
Upvotes: 29