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__ですか? 代わりに%sandを使用する必要がありますか?repr(self.vals)

4

1 に答える 1

7

オペレーターはタプル自体を受け取るため、基本的には次の%ようにします。

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

self.vals1 要素のタプルでラップします。

'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 に答える