Вопрос: python - Как форматировать переменное число аргументов в строку?


Мы знаем, что форматирование один  аргумент может быть выполнен с использованием один   %s в строке:

>>> "Hello %s" % "world"
'Hello world'

для двух аргументов мы можем использовать два %s (Дух!):

>>> "Hello %s, %s" % ("John", "Joe")
'Hello John, Joe'

Итак, как я могу форматировать переменное количество аргументов без необходимости явно определять в базовой строке ряд %s равное количеству аргументов для форматирования ? было бы очень здорово, если бы что-то вроде этого существовало:

>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary")
Hello JohnJoeMary
>>> "Hello <cool_operator_here>" % ("John", "Joe", "Mary", "Rick", "Sophie")
Hello JohnJoeMaryRickSophie

Возможно ли это, или единственное, что я могу сделать, это сделать что-то вроде:

>>> my_args = ["John", "Joe", "Mary"]
>>> my_str = "Hello " + ("".join(["%s"] * len(my_args)))
>>> my_str % tuple(my_args)
"Hello JohnJoeMary"

ПРИМЕЧАНИЕ. необходимость  сделать это с помощью %s оператор форматирования строки.

ОБНОВИТЬ :

Это должно быть с %s потому что функция из другой библиотеки форматирует мою строку с помощью этого оператора, учитывая, что я передаю неформатированную строку и аргументы для ее форматирования, но она делает некоторые проверки и исправления (если необходимо) в аргументах перед фактическим форматированием.

Поэтому мне нужно это назвать:

>>> function_in_library("Hello <cool_operator_here>", ["John", "Joe", "Mary"])
"Hello JohnJoeMary"

Спасибо за вашу помощь!


12


источник


Ответы:


Вы будете использовать str.join() в списке без  форматирование строк, а затем интерполировать результат :

"Hello %s" % ', '.join(my_args)

Демо-версия:

>>> my_args = ["foo", "bar", "baz"]
>>> "Hello %s" % ', '.join(my_args)
'Hello foo, bar, baz'

Если некоторые из ваших аргументов еще не строки, используйте понимание списка:

>>> my_args = ["foo", "bar", 42]
>>> "Hello %s" % ', '.join([str(e) for e in my_args])
'Hello foo, bar, 42'

или использовать map(str, ...):

>>> "Hello %s" % ', '.join(map(str, my_args))
'Hello foo, bar, 42'

Вы бы сделали то же самое с вашей функцией:

function_in_library("Hello %s", ', '.join(my_args))

Если вы ограничены (довольно произвольным) ограничением, которое вы не можете использовать join в списке аргументов интерполяции, используйте join вместо этого создайте строку форматирования:

function_in_library("Hello %s" % ', '.join(['%s'] * len(my_args)), my_args)

19