Я столкнулся с этой проблемой сегодня и нашел другое решение.Если вы беспокоитесь о том, как это выглядит при печати, вы можете заменить объект файла stdout на пользовательский, который при вызове write () выполняет поиск любых объектов, которые выглядят как плавающие, и заменяет их собственным форматом дляих.
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
Бесполезно, если вы просто помещаете числа в строку, но в конечном итоге вам, вероятно, захочется записать эту строку в какой-нибудь файл, и вы сможете обернутьэтот файл с вышеуказанным объектом.Очевидно, что это немного снижает производительность.
Справедливое предупреждение: я не проверял это в Python 3, я понятия не имею, сработает ли это.