2017-02-09 19 views
2
>>> b'potato {} potato'.format(u'potato') # return value matches the template 
'potato potato potato' 
>>> b'potato %s potato' % u'potato' # return value is coerced 
u'potato potato potato' 

文字列を書式テンプレートを使用してstr.formatではテンプレートは戻り値の型を制御しますが、str.__mod__にテンプレートがunicodeに「昇格」されます。防止型の強制

  1. これは文書化されているか、または信頼できる動作ですか?
  2. 戻り値の型がテンプレートと一致するようにパーセントスタイルの置換を行う方法はありますか?

明白な推測では動作しません:

>>> b'potato %b potato' % u'potato' 
ValueError: unsupported format character 'b' (0x62) at index 8 

私は型チェックおよび/または明示的なデコード/エンコードコールを行うソリューションに興味がないんです。理想的には、テンプレート変数がユニコードオブジェクトでasciiにエンコードできない場合は、テンプレートをUnicodeEncodeErrorにすることをお勧めします。

+2

ワウ。 Python 2ではユニコード/バイトの区別がぼやけて壊れているように見えますが、これは修正されたPythonのバージョンがある場合のみです;) –

+1

1)強制変換は '%s'変換タイプIそれはドキュメントの変換テーブルに記載されていることは間違いありません。 2)それを疑う:( –

答えて

2

これは、それが記載されているセクションの先頭には、具体的には、セクションString Formatting Operationsの開始に変換テーブルの両方に文書化されています。形式はUnicodeオブジェクトの場合... format % values考える

または%s変換を使用して変換されるオブジェクトのいずれかがUnicodeオブジェクトである場合、結果もUnicodeオブジェクトになります。

です。

.encodeが含まれていない解決策は、私が理解しているところでは達成できません。また、%rでの送信もオプションではありません。 str.__mod__はあなたのために多くを扱わない高速な操作です。.formatの礼儀の大胆さを持っており、あなたには.encodeを呼びます。

脇の下:誰かがさまよっていた場合、PEP 3101の指定で、.formatの場合、フォーマット文字列のタイプによって結果が決まることも文書化されています。