1. ホーム
  2. python

[解決済み】Python TypeError: object.__format__ に渡される空でないフォーマット文字列

2022-02-16 12:32:40

質問

最近、このTypeError例外に遭遇し、デバッグが非常に困難であることがわかりました。最終的には、この小さなテストケースに落とし込みました。

>>> "{:20}".format(b"hi")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

これは私にとって、とにかく非常に非自明なことです。私のコードでは、バイト列をユニコードにデコードすることで回避しています。

 >>> "{:20}".format(b"hi".decode("ascii"))
 'hi                  '

この例外はどういう意味ですか?もっと明確にする方法はないでしょうか?

解決方法は?

bytes オブジェクトには __format__ メソッドを使用するため、デフォルトの object が使用されます。

>>> bytes.__format__ is object.__format__
True
>>> '{:20}'.format(object())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

ただ、これらにはストレートにアノニマス・フォーマット以外のものは使えないということです。文字列オブジェクトへの明示的な変換 (たとえば bytesstr )を取得するために フォーマット仕様のサポート .

を使えば、変換を明示的に行うことができます。 !s 文字列の変換を行います。

>>> '{!s:20s}'.format(b"Hi")
"b'Hi'               "
>>> '{!s:20s}'.format(object())
'<object object at 0x1100b9080>'

object.__format__ は、暗黙の文字列変換を避けるため、フォーマット文字列を明示的に拒否しています。