[英]Why am I getting KeyError when calling dictionary key in self.assertEqual signature?
[英]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.