簡體   English   中英

當密鑰明確存在時,為什么會出現KeyError?

[英]Why am I getting a KeyError when the key clearly exists?

我有一個類Commit

class Commit:
    def __init__(self, uid, message):
        self.uid = uid
        self.message = message

    def __str__(self):
        print(self.__dict__)
        return textwrap.dedent('''\
        Commit: {uid}

        {message}
        ''').format(self.__dict__)

這似乎對我來說; print調用的輸出中可以看出,兩個鍵都存在且為非None

{'message': 'Hello, world!', 'uid': 1}

然而,調用str.format()在列表行提出了一個KeyError

\n Traceback(最近一次調用最后一次):\n   文件“../Pynewood/pnw”,第7行,in \n     CLI(sys.argv中)\n   在cli中輸入文件“/Users/daknok/Desktop/Pynewood/pynewood/cli.py”,第11行\n     打印(提交)\n   文件“/Users/daknok/Desktop/Pynewood/pynewood/commit.py”,第14行,在__str__中\n     ''').format(個體.__ dict__)\n KeyError:'uid'\n

為什么我會收到此錯誤,而字典中明確存在鍵?

str.format()需要kwargs,所以你需要使用**來擴展字典。

def __str__(self):
    return textwrap.dedent('''\
    Commit: {uid}

    {message}
    ''').format(**self.__dict__)

Radek Slupik是對的, str.format期望單個關鍵字參數,並且在問題的代碼中, dict只是作為format的第一個位置參數傳遞,格式字符串中的{0}將被擴展。 所以應該使用str.format(** mapping )

但是從Python 3.2開始你可以使用str. format_map ( mapping ) 而是str. format_map ( mapping ) 它與str.format(** mapping )工作方式類似,但它不會將映射轉換為dict 這允許我們提供自定義映射類進行format ,如文檔中的示例所示:

>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'

它看起來也更好,可能會帶來微小的性能提升。

暫無
暫無

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

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