Esto es sobre el mismo problema que en this question about floats.cadena de formato con “{0: d}” no convierte a entero
Cuando se tiene un valor que podría conseguir convertir en un entero, el viejo %d
sería convertirlo, pero el formato no.
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'
¿Hay una manera de modificar el comportamiento de formato, sin tocar la clase del valor a ser formateado (sin añadir un método __format__
a esa clase)?
Editar: Mi objetivo es conseguir que el formato dependiente de la cadena de formato, pero no en el valor. lo tanto, si la cadena de formato dice "d" o "x", convertir el valor a int y luego a decimal o representación hexadecimal. Si la cadena de formato dice "s", conviértala directamente en cadena. Como lo hizo el antiguo %
.
De hecho, podría incluso agregar un método __format__
a la clase del valor. ¿Pero cómo verifico, en ese método, si la especificación de formato dada es una especificación de formato entero? Sin volver a implementar el analizador de especificación de formato del formato incorporado.
Editar: Aquí hay una solución con __format__
y excepciones. Alguna mejor idea?
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"
Dice diez es una cadena, que está tratando de formato como un número. –