web-dev-qa-db-ja.com

Python 3.6+にフォーマットされたバイト文字列リテラルはありますか?

フォーマットされたバイト文字列リテラルを探しています。具体的には、同等のもの

name = "Hello"
bytes(f"Some format string {name}")

おそらくfb"Some format string {name}"のようなものです。

そのようなものは存在しますか?

34
Enrico Borba

いいえ アイデアはPEPで明示的に却下されています

bytes.format()をサポートしていないのと同じ理由で、_'f'_と_'b'_文字列リテラルを組み合わせることはできません。主な問題は、オブジェクトの__format__()メソッドが、バイト文字列と互換性のないUnicodeデータを返す可能性があることです。

バイナリf文字列は、最初にbytes.format()のソリューションを必要とします。このアイデアは過去に提案され、最近では PEP 461 で提案されています。そのような機能の議論は通常どちらかを示唆しています

  • __bformat__()などのメソッドを追加して、オブジェクトをバイトに変換する方法をオブジェクトが制御できるようにする、または

  • bytes.format()は、str.format()ほど汎用的または拡張可能ではありません。

これらの機能が必要な場合、これらのオプションはどちらも将来的にオプションとして残ります。

21
jwodder

python 3.6.2より、このバイトのパーセント形式は、いくつかのユースケースで機能します:

print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string)

しかし、コメンターが指摘したように:

これは同じではありません。 %a(または%r)は、文字列そのものではなく、文字列の表現を提供します。たとえば、b '%a'%b'bytes 'はb'bytes'ではなくb "b'bytes '"を返します。

これは、UIでフォーマット済みのbyte_or_unicode_stringを表示する必要があるかどうか、またはさらに操作が必要になる可能性があるかどうかに応じて、問題になる場合と問題にならない場合があります。

3
Bob Jordan