Ich habe kürzlich diese TypeError-Ausnahme getroffen, die ich nur sehr schwer debuggen konnte. Ich habe es schließlich auf diesen kleinen Testfall reduziert:
>>> "{:20}".format(b"hi")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__
Das ist mir sowieso nicht klar. Die Problemumgehung für meinen Code bestand darin, die Byte-Zeichenfolge in Unicode zu dekodieren:
>>> "{:20}".format(b"hi".decode("ascii"))
'hi '
Was bedeutet diese Ausnahme? Gibt es eine Möglichkeit, dies klarer zu machen?
python
python-3.x
string-formatting
Chris AtLee
quelle
quelle
TypeError
in Python 3.4+ und betrifft alles, was erbt,object
ohne es__format__
auf dem Weg zu definieren (zNone
. B.class T(object): pass
usw.).None
. So'{0:.4f}'.format(bla)
verursachte diese AusnahmeAntworten:
bytes
Objekte haben keine__format__
eigene Methode, daher wird der Standardwert vonobject
verwendet:>>> 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__
Es bedeutet nur, dass Sie nichts anderes als eine direkte, unformatierte, nicht ausgerichtete Formatierung für diese verwenden können. Konvertieren Sie explizit in ein Zeichenfolgenobjekt (wie beim Dekodieren
bytes
instr
), um Unterstützung für Formatspezifikationen zu erhalten .Sie können die Konvertierung mithilfe der
!s
Zeichenfolgenkonvertierung explizit machen :>>> '{!s:20s}'.format(b"Hi") "b'Hi' " >>> '{!s:20s}'.format(object()) '<object object at 0x1100b9080>'
object.__format__
lehnt Formatzeichenfolgen explizit ab, um implizite Zeichenfolgenkonvertierungen zu vermeiden, insbesondere weil Formatierungsanweisungen typspezifisch sind.quelle
Dies passiert auch beim Formatieren
None
:>>> '{:.0f}'.format(None) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: non-empty format string passed to object.__format__
Das hat einen Moment gedauert (in meinem Fall, als
None
eine Instanzvariable zurückgegeben wurde)!quelle