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

时间:2016-04-21 21:21:40

标签: python string python-3.x string-formatting

我不理解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)方法?

3 个答案:

答案 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.' 是不可能的,因为它有无限多个键!