Как добавить __format__ в namedTuple в Python 3. 5+?

Вопрос: Я работаю с кодом, написанным для более ранней версии Python. TensorShape = namedtuple('TensorShape', ['batch_size', 'channels', 'height', 'width']) Позже у меня есть этот (сокращенный) код: s = [hdr, '-' * 94] ... s.append('{: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

Вопрос:

Я работаю с кодом, написанным для более ранней версии 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)’

Оцените статью
Добавить комментарий