2016-12-15 7 views
5

は、次の点を考慮してくださいタプルではなくリストではないのはなぜですか?

st = "Hi: %s, you are: %d" 
x = ['user', 25] 

st % x # Doesn't work 
st % ("user", 25) # Works 
st % (*x,) # Works 

私はちょうどそれは非常に奇妙な制限

+1

[仕様](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting)に記載されているためです。その根拠については、python-devメーリングリストを試してみてください。 –

+0

とにかく 'str.format'を使用してください。 –

+0

'明示的には暗黙に優れています 'Zen of Pythonから。 – MYGz

答えて

6

ああだと思ったが、あなたは「リストに対してフォーマット」缶:

In [4]: '%s' % [1,2] 
Out[4]: '[1, 2]' 

%文字列補間することができますsingle non-tuple objectまたはタプルのいずれかが続きます。

タプルの場合、引数はアンパックされ、文字列のプレースホルダと照合されます。オブジェクトが単一の非タプルオブジェクトである場合、オブジェクト全体が文字列のプレースホルダに渡されます。

このやや気味悪い行為は、Python開発者が構文的にクリーンなstr.formatメソッドを導入する動機の一部です。 「%」演算子は、主にそれが バイナリ演算子であり、そのために最大2つの引数を取ることができるという事実によって制限されている

PEP 3101からも

、。 これらの引数の1つは、書式文字列 に既に割り当てられており、他のすべての変数は残りの 引数に圧縮されます。現在の方法は、辞書または第2引数として タプルのいずれかを使用することですが、多くの人々がコメントしたように、 これは柔軟性に欠けています。 「すべてか何かではない」というアプローチ (つまり、位置指定引数、つまり のどちらかのみを選択する必要がある、または名前付き引数のみを選択する必要があることを意味する)は、過度に制約されていると感じられます。

+2

良い点!また、タプルではなく繰り返し可能なものがあれば、文字列は文字の繰り返し可能性として解釈されます。 – RemcoGerlich

関連する問題