String-Formatierung mit "{0:d}" nicht konvertieren zu integer
Dies ist in etwa das gleiche Problem wie in diese Frage schwebt über.
Wenn Sie habe einen Wert bekommen könnte, in eine Ganzzahl konvertiert, die alten %d
umwandeln würde, aber das format nicht.
class MyIntegerTenClass:
def __int__(self):
return 10
def __str__(self):
return 'ten'
ten = MyIntegerTenClass()
print '%d, %02X, %s' % (ten, ten, ten) # ok
print '{0}'.format(ten) # ok
print '{0:d}, {0:02X}'.format(ten) # ValueError: Unknown format code 'd' for object of type 'str'
Gibt es eine Möglichkeit, ändern Sie das Verhalten von format, ohne Sie zu berühren die Klasse der Wert formatiert werden (ohne eine __format__
- Methode dieser Klasse)?
Edit: Mein Ziel ist es, die Formatierung abhängig von der format-string, aber nicht auf den Wert.
Also, wenn der format-string sagt, "d" oder "x", konvertieren Sie den Wert in int und dann in dezimaler oder hexadezimaler Darstellung.
Wenn der format-string sagt, "s", konvertiert Sie zu einem string direkt. Als die alte %
haben.
Eigentlich könnte ich sogar ein __format__
Methode der Klasse des Wertes. Aber wie kann ich überprüfen, dass die Methode, wenn das angegebene format-Spezifikation ist eine integer-format-Spezifikation? Ohne reimplementing die format-Spezifikation parser der builtin-format.
Edit: Hier eine Lösung mit __format__
und Ausnahmen. Irgendwelche besseren Ideen?
class MyIntegerTenClass:
def __int__(self):
return 10
def __str__(self):
return 'ten'
def __format__(self, spec):
fmt = '{0:%s}'%spec
try:
return fmt.format(str(self))
except:
return fmt.format(int(self))
ten = MyIntegerTenClass()
print '%d, %02X, %s' % (ten, ten, ten) # ok, prints "10, 0A, ten"
print '{0:d}, {0:02X}, {0}'.format(ten) # ok, prints "10, 0A, ten"
- Es sagt ten ist eine Zeichenfolge, die Sie versuchen zu formatieren Sie als Zahl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen ersten Ansatz für dieses problem sein könnte, einfach zu
try
es:Wenn
MyIntegerTenClass
kann eingefügt werden, in der format-Zeichenfolge als eine Zeichenfolge ist, wird es sein. Wenn nicht, wird es umgewandelt in ein int und erneut zuformat
.Wenn Sie möchten, dass die Standard-Darstellung zu
10
stattten
müssen Sie nur swap die Umwandlung Linien:Test Ausgabe:
Als Nachtrag, ich glaube nicht, dass Sie werde in der Lage sein, um das Verhalten, das Sie wollen, ohne zu definieren
__format__
; jedoch, können Sie entwickeln eine differenziertere Betrachtung mit Hilfe einerFormatter
Objekt. Dennoch denke ich, die Ausnahme-basierten Ansatz gibt Ihnen eine Menge von built-in-Funktionalität kostenlos.pass einen integer anstelle eines Strings, und es wird funktionieren gut.
Heißt es zehn ist eine Zeichenfolge, die Sie versuchen zu formatieren Sie als Zahl.
Versuchen Sie wickelte Sie in ein cast: