首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Python字符串格式默默地忽略了类实例中不匹配的参数计数?

为什么Python字符串格式默默地忽略了类实例中不匹配的参数计数?
EN

Stack Overflow用户
提问于 2015-02-11 20:14:15
回答 1查看 537关注 0票数 4

通常,如果字符串中占位符的数量与传递的参数数不匹配,Python旧式字符串格式就会发出抱怨:

代码语言:javascript
复制
>>> 'no.placeholders.here' % 'test'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

但是,当传递的参数是一个用户定义类的实例时,它会悄悄地忽略它:

代码语言:javascript
复制
>>> class Test(object): pass
>>> 'no.placeholders.here' % Test()
'no.placeholders.here'

这种行为似乎不一致,并导致了一些难以追踪的错误。为什么格式参数的类型对此错误很重要?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-11 21:14:58

这就是为什么%**-formatting 是 _old**_的原因

%-formatting因其在参数处理方面的不一致而闻名,这会导致异常或不取决于类型。只有两种方法可以使用%格式并避免不一致:

  1. 确保格式化字符串恰好包含一个格式化字段,并将对象作为唯一正确的参数进行格式化。
  2. 使用tupledict作为正确的参数。不要使用lists、sets或Models。只使用 tuples和dicts

这些都是取自文档

如果格式需要一个参数,则值可能是单个非元组对象。否则,值必须是包含格式字符串指定的项目数的元组,或者是单个映射对象(例如,字典)。

您的示例不属于这两种情况,因为您有0格式字段,这与1不同,因此正确的参数必须是tuple或映射,但您正在传递一个字符串和一个用户定义的对象。因此,你处于“未定义的行为”之下。

错误消息的不一致已经在问题中讨论过了(在我的回答中)。

如果想要更一致的行为,请使用str.format

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28463639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档