我不理解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)
方法?
答案 0 :(得分:13)
str.format(**kwargs)
在调用过程中生成一个新词典。 str.format_map(kwargs)
没有。除了稍快一些,str.format_map()
还允许您使用具有特殊行为的dict
子类(或实现映射的其他对象),例如优雅地处理缺失的键。当项目被复制到新词典时,这种特殊行为将会丢失。
请参阅:https://docs.python.org/3/library/stdtypes.html#str.format_map
答案 1 :(得分:2)
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
答案 2 :(得分:0)
还有一件你不能用 public/src/
做的事:
.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())
解包到字典中,Python 需要知道映射中的所有键是什么,甚至没有定义。
另一个:
**kwargs
解包 >>> 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.'
是不可能的,因为它有无限多个键!