Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python - How to format variable number of arguments into a string?

Tags:

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!

like image 706
Gerard Avatar asked Aug 22 '13 21:08

Gerard


People also ask

What does {: 3f mean in Python?

"f" stands for floating point. The integer (here 3) represents the number of decimals after the point. "%. 3f" will print a real number with 3 figures after the point. – Kefeng91.

What does %d and %s do in Python?

In, Python %s and %d are used for formatting strings. %s acts a placeholder for a string while %d acts as a placeholder for a number. Their associated values are passed in via a tuple using the % operator. This code will print abc 2.


1 Answers

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) 
like image 105
Martijn Pieters Avatar answered Oct 13 '22 19:10

Martijn Pieters