3

请有人解释为什么在使用 %r 和元组时出现以下错误?

>>> repr((1,2))
'(1, 2)'
>>> class Foo(object):
...     def __init__(self,vals):
...             self.vals=vals
...     def __repr__(self):
...             return "Foo(%r)" % self.vals
... 
>>> foo = Foo((1,2))
>>> foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in __repr__
TypeError: not all arguments converted during string formatting

打印出来的合适方法是什么__repr__?我应该使用%sandrepr(self.vals)代替吗?

4

1 回答 1

7

%运算符本身接受一个元组,所以你基本上是这样做的:

'Foo(%r)' % (1, 2)

包裹self.vals在一个单元素元组中:

'Foo(%r)' % (self.vals,)

原则上,您也可以使用在变量中定义的字符串:

REPRFORMAT % (self.vals,)

在这种情况下,您希望将其留给该变量(可能取自配置文件?)如何格式化self.vals,无论是它%r还是%s.

您也可以改用该.format()方法

return 'Foo({0!r})'.format(self.vals)

这种格式为您提供了更大的输入灵活性;您可以处理元组中的各个项目vals,例如:

return 'Foo(({0[0]:04d}, {0[1]:02d}))'.format(self.vals)

这将导致Foo((0001, 04))您的示例输入。

于 2013-01-16T09:12:06.447 回答