簡體   English   中英

str.format_map(mapping) 和 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()是不可能的,因為它有無限多個鍵!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM