Вопрос:
Я работаю с кодом, написанным для более ранней версии Python.
TensorShape = namedtuple(‘TensorShape’, [‘batch_size’, ‘channels’, ‘height’, ‘width’])
Позже у меня есть этот (сокращенный) код:
s = [hdr, ‘-‘ * 94] … s.append(‘{:<20} {:<30} {:>20} {:>20}’.format(node.kind, node.name, data_shape, tuple(out_shape)))
который tuple(out_shape) на tuple(out_shape) с исключением
TypeError: unsupported format string passed to tuple.__format__
потому что out_shape – это TensorShape и не имеет определенного метода __format__.
Поэтому я TensorShape определение TensorShape на
def format_tensorshape(format_spec): return format(«{0} {1} {2} {3}») TensorShape = namedtuple(‘TensorShape’, [‘batch_size’, ‘channels’, ‘height’, ‘width’]) TensorShape.__format__ = format_tensorshape
Но этот код все еще взрывается вниз по течению с тем же исключением.
Что я делаю не так?
Лучший ответ:
Вы были на правильном пути – просто подключите два аргумента, переданных format_tensorshape к вашему вызову для format:
import collections def format_tensorshape(self, format_spec): return format(«{0} {1} {2} {3}».format(*self), format_spec) TensorShape = collections.namedtuple(‘TensorShape’, [‘batch_size’, ‘channels’, ‘height’, ‘width’]) TensorShape.__format__ = format_tensorshape out_shape = TensorShape(1,2,3,4) print(‘{:>20}’.format(out_shape))
доходность
1 2 3 4 Ответ №1
Вы можете просто использовать форматирование на основе строкового представления. Это возможно с флагом преобразования !s и потому, что строки знают, как интерпретировать спецификацию форматирования, нет необходимости создавать собственный метод __format__ для вашего namedtuple:
s.append(‘{:<20} {:<30} {:>20} {!s:>20}’.format(node.kind, node.name, data_shape, tuple(out_shape))) # ^^—- here I added the !s
Например:
>>> from collections import namedtuple >>> TensorShape = namedtuple(‘TensorShape’, [‘batch_size’, ‘channels’, ‘height’, ‘width’]) >>> ‘{!s:>20}’.format(tuple(TensorShape(1,1,1,1))) ‘ (1, 1, 1, 1)’