web-dev-qa-db-ja.com

python-可変数の引数を文字列にフォーマットする方法?

one引数のフォーマットは、文字列でone _%s_を使用して実行できることがわかっています。

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

2つの引数の場合、2つの_%s_(duh!)を使用できます。

_>>> "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"
_

注:I (必要を使用して_%s_文字列フォーマット演算子を使用します。

[〜#〜]更新[〜#〜]

別のライブラリの関数は、フォーマットされていない文字列と引数を渡してフォーマットすることを前提として、その演算子を使用して文字列をフォーマットしますが、(必要に応じて)チェックと修正を行うため、_%s_と一緒にする必要があります。実際にフォーマットを行う前の引数。

だから私はそれを呼ぶ必要があります:

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

ご協力いただきありがとうございます!

18
Gerard

リストでstr.join()without文字列フォーマットを使用し、次にresultを補間します。

_"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)
_
23
Martijn Pieters