Me encontré con este problema hoy, y se me ocurrió una solución diferente. Si le preocupa cómo se ve cuando se imprime, puede reemplazar el objeto de archivo stdout por uno personalizado que, cuando se invoca a write(), busca cualquier elemento que parezca flotante y lo reemplaza con su propio formato para ellos.
class ProcessedFile(object):
def __init__(self, parent, func):
"""Wraps 'parent', which should be a file-like object,
so that calls to our write transforms the passed-in
string with func, and then writes it with the parent."""
self.parent = parent
self.func = func
def write(self, str):
"""Applies self.func to the passed in string and calls
the parent to write the result."""
return self.parent.write(self.func(str))
def writelines(self, text):
"""Just calls the write() method multiple times."""
for s in sequence_of_strings:
self.write(s)
def __getattr__(self, key):
"""Default to the parent for any other methods."""
return getattr(self.parent, key)
if __name__ == "__main__":
import re
import sys
#Define a function that recognises float-like strings, converts them
#to floats, and then replaces them with 1.2e formatted strings.
pattern = re.compile(r"\b\d+\.\d*\b")
def reformat_float(input):
return re.subn(pattern, lambda match: ("{:1.2e}".format(float(match.group()))), input)[0]
#Use this function with the above class to transform sys.stdout.
#You could write a context manager for this.
sys.stdout = ProcessedFile(sys.stdout, reformat_float)
print -1.23456
# -1.23e+00
print [1.23456] * 6
# [1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00, 1.23e+00]
print "The speed of light is 299792458.0 m/s."
# The speed of light is 3.00e+08 m/s.
sys.stdout = sys.stdout.parent
print "Back to our normal formatting: 1.23456"
# Back to our normal formatting: 1.23456
No sirve de nada si sólo está poniendo números en una cadena, pero con el tiempo es probable que desee para escribir esa cadena a algún tipo de archivo en alguna parte, y usted puede ser capaz de envolver que el archivo de la encima del objeto Obviamente, hay un poco de una sobrecarga de rendimiento.
Advertencia de feria: No he probado esto en Python 3, no tengo idea de si funcionaría.
El problema es que he flotado dentro de listas, y cuando imprimo (lista) no tengo control sobre eso. (Esto se aplica también para otros objetos, por cierto). Modificar el código fuente es factible porque conozco C, pero no es exactamente lo que estaba pensando. Gracias. – AkiRoss
@AkiRoss: Entonces, lo que desea corregir es la lista, no los flotadores ... –
@AkiRoss, si desea más control, simplemente imprima los artículos individualmente. –