我正在处理为早期版本的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)上爆炸,除了
TypeError: unsupported format string passed to tuple.__format__

因为out_shape是一个TensorShape并且没有定义__format__方法。
所以我把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_tensorshapetwo arguments连接到您的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

09-03 21:51