str.format_map(映射)和str.format有什么区别

What is difference between str.format_map(mapping) and str.format

我不明白 str.format_map(mapping) 方法。我只知道它类似于 str.format(*args, **kwargs) 方法,您也可以将字典作为参数传递(请参阅我的示例)。 示例:

print ("Test: argument1={arg1} and argument2={arg2}".format_map({'arg1':"Hello",'arg2':123}))

有人可以向我解释 str.format_map(mapping)str.format(*args, **kwargs) 方法之间的区别以及为什么我需要 str.format_map(mapping) 方法吗?

str.format(**kwargs)在调用的过程中新建字典。 str.format_map(kwargs) 没有。除了速度稍快之外,str.format_map() 还允许您使用具有特殊行为的 dict 子类(或其他实现映射的对象),例如优雅地处理丢失的键。否则,当将项目复制到新词典时,这种特殊行为将会丢失。

参见:https://docs.python.org/3/library/stdtypes.html#str.format_map

str.format(**mapping) 被调用时会创建一个新字典,而 str.format_map(mapping) 不会。 format_map(mapping) 允许您传递丢失的键。这在使用 dict 子类 本身 时很有用。

class Foo(dict): # inheriting the dict class
    def __missing__(self,key):
        return key
print('({x},{y})'.format_map(Foo(x='2')))  # missing key y 
print('({x},{y})'.format_map(Foo(y='3')))  # missing key x

这是 .format(**kwargs) 不能做的另一件事:

>>> class UserMap:
    def __getitem__(self, key):
        return input(f"Enter a {key}: ")

>>> mad_lib = "I like to {verb} {plural noun} and {plural noun}.".format_map(UserMap())
Enter a verb: smell
Enter a plural noun: oranges
Enter a plural noun: pythons
>>> mad_lib
'I like to smell oranges and pythons.'

调用 .format(**UserMap()) 甚至不起作用,因为为了将 **kwargs 解压到字典中,Python 需要知道映射中的所有键是什么,甚至没有定义。

另一个:

>>> class NumberSquarer:
    def __getitem__(self, key):
        return str(int(key.lstrip('n'))**2)

    
>>> "{n17} is a big number, but {n20} is even bigger.".format_map(NumberSquarer())
'289 is a big number, but 400 is even bigger.'

解压是不可能的 **NumberSquarer() 因为它有无限多的键!