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.
InformationsquelleAutor Sebastian | 2012-07-12
Schreibe einen Kommentar