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()
因为它有无限多的键!
我不明白 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()
因为它有无限多的键!