Python 为什么我会得到;并非所有参数都已转换”;将%r与元组一起使用时?
有人能解释一下为什么我在元组中使用%r时会出现以下错误吗Python 为什么我会得到;并非所有参数都已转换”;将%r与元组一起使用时?,python,python-2.7,Python,Python 2.7,有人能解释一下为什么我在元组中使用%r时会出现以下错误吗 >>> repr((1,2)) '(1, 2)' >>> class Foo(object): ... def __init__(self,vals): ... self.vals=vals ... def __repr__(self): ... return "Foo(%r)" % self.vals ... >>>
>>> 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
报告((1,2))
'(1, 2)'
>>>类Foo(对象):
... 定义初始值(自身,VAL):
... self.vals=vals
... 定义报告(自我):
... 返回“Foo(%r)”%self.vals
...
>>>foo=foo((1,2))
>>>福
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在报告中__
TypeError:在字符串格式化过程中并非所有参数都已转换
打印出
\uuu repr\uuu
的适当方式是什么?我应该使用%s
和repr(self.vals)
来代替吗?操作符本身取一个元组,所以基本上是这样做的:
'Foo(%r)' % (1, 2)
将self.vals
包装在一个元素元组中:
'Foo(%r)' % (self.vals,)
原则上,您也可以使用变量中定义的字符串:
REPRFORMAT % (self.vals,)
在这种情况下,您希望将其留给该变量(可能来自配置文件?)如何格式化self.vals
,无论是%r
还是%s
您也可以使用以下选项:
这种格式为您提供了更大的输入灵活性;您可以在vals
元组中处理单个项,例如:
return 'Foo(({0[0]:04d}, {0[1]:02d}))'.format(self.vals)
这将导致您的示例输入出现
Foo((0001,04))
。您可以轻松检查使用%s
时发生的情况,您为什么觉得需要到这里来询问它?@InbarRose:因为对于不熟悉%
字符串格式运算符的人来说,这种行为是意外的。@Inbar“请有人解释一下为什么我在元组中使用%r时会出现以下错误?”这就是我提出此问题的原因。我很想了解为什么会出现此错误以及最合适的(Pythonic)处理方法。是否对使用“推荐”方法有共识?我个人认为“Foo(%s)”%repr(self.vals)是最容易阅读的,但正如我上面提到的,它回避了一个问题:为什么要使用%r.@Tim:the.format()
字符串格式化方法已被添加以替换%
,尽管后者的语法在Python 3中仍然存在。@Tim:进行了一些扩展,给出了一些使用%r
的参数。感谢您提供的信息。我没有遇到.format()
到目前为止。我认为现在我将坚持使用%s
,因为我认为它对于我的简单用例更具可读性。
return 'Foo(({0[0]:04d}, {0[1]:02d}))'.format(self.vals)