首页 > 解决方案 > 在 collections.defaultdict 示例“%(object)s”中“object”是如何工作的?

问题描述

在 collections.defaultdict() 的 Python3 文档中,示例部分给出了“%()s”格式的不寻常用法:

def constant_factory(value):
    return lambda: value

d = defaultdict(constant_factory('<missing>'))

d.update(name='John', action='ran')

'%(name)s %(action)s to %(object)s' % d

>>> 'John ran to <missing>'

我熟悉“%()s”表示法(如果有人可以将我指向此用法的文档,则可以加分),但我的问题是,“对象”从何而来?我无法弄清楚这是如何工作的,因为字典中没有“对象”键:

print(f"{d=}")

>>> d=defaultdict(<function constant_factory.<locals>.<lambda> at 0x7fa088a5ab80>, {'name': 'John', 'action': 'ran'})

标签: python-3.x

解决方案


字符串格式化行告诉 Python 将值d['object']插入字符串。defaultdict 的工作方式是,如果您引用一个不存在的键,它将使用该键和您给它的工厂的默认值创建一个条目。因此,在这种情况下,当格式字符串引用 时d['object'],defaultdict 创建了一个条目,其键为'object',值为 ,'<missing>'并将值适当地插入到字符串中。

我猜想您显示的 d 内容的输出是在格式字符串引用创建'object':'<missing>'条目之前运行的。

对于奖励积分,所谓的“旧式”字符串格式化操作%记录在https://docs.python.org/2/library/stdtypes.html#string-formatting。Python 3 中引入了不同的字符串格式化工具。


推荐阅读