通常,如果字符串中占位符的数量与传递的参数数不匹配,Python旧式字符串格式就会发出抱怨:
>>> 'no.placeholders.here' % 'test'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting但是,当传递的参数是一个用户定义类的实例时,它会悄悄地忽略它:
>>> class Test(object): pass
>>> 'no.placeholders.here' % Test()
'no.placeholders.here'这种行为似乎不一致,并导致了一些难以追踪的错误。为什么格式参数的类型对此错误很重要?
发布于 2015-02-11 21:14:58
这就是为什么%**-formatting 是 _old**_的原因
%-formatting因其在参数处理方面的不一致而闻名,这会导致异常或不取决于类型。只有两种方法可以使用%格式并避免不一致:
tuple或dict作为正确的参数。不要使用lists、sets或Models。只使用 tuples和dicts。这些都是取自文档的
如果格式需要一个参数,则值可能是单个非元组对象。否则,值必须是包含格式字符串指定的项目数的元组,或者是单个映射对象(例如,字典)。
您的示例不属于这两种情况,因为您有0格式字段,这与1不同,因此正确的参数必须是tuple或映射,但您正在传递一个字符串和一个用户定义的对象。因此,你处于“未定义的行为”之下。
错误消息的不一致已经在这问题中讨论过了(在我的回答中)。
如果想要更一致的行为,请使用str.format。
https://stackoverflow.com/questions/28463639
复制相似问题