Python "in" 关键字引发 KeyError
Python "in" keyword is raising KeyError
为了检查 TodoistAPI
class 中的键是否存在,我使用了 "in" 关键字。但是,它会导致 KeyError
.
我隔离了代码片段以检查导致 KeyError
的确切原因以及提供了哪些输入。
api = TodoistAPI(token)
api.sync()
print("id" in api.state["items"][0])
api.state["items"][0]
包含:
Item({'assigned_by_uid': None,
'checked': 0,
'child_order': 0,
'collapsed': 0,
'content': 'example task',
'date_added': '0',
'date_completed': None,
'day_order': 0,
'due': {'date': '0',
'is_recurring': True,
'lang': 'de',
'string': 'every day',
'timezone': None},
'has_more_notes': False,
'id': 0,
'in_history': 0,
'is_deleted': 0,
'labels': [0, 0],
'parent_id': None,
'priority': 1,
'project_id': 0,
'responsible_uid': None,
'section_id': None,
'sync_id': None,
'user_id': 0})
我期望print(...)
的输出是True
或False
,但实际输出如下
Traceback (most recent call last):
File "/Users/path/to/file.py", line 11, in
print("id" in applicationInterface.state["items"][0])
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/todoist/models.py", line 16, in __getitem__
return self.data[key]
KeyError: 0
Process finished with exit code 1
我还在 Todoist Github-Repository 中创建了一个问题:https://github.com/Doist/todoist-python/issues/64
最终,这是 Todoist
库中的错误。
首先,让我们想象这样一个额外的行:
item = api.state["items"][0]
print("id" in item)
这意味着当您编写 "id" in item
时,Python 会检查 class 中的 __contains__
方法。 Item
class 不 定义 __contains__
,但定义 __getitem__
(通过其基数 Model
)。
根据 Python 语言参考,__getitem__
will be called 评估 in
,使用 回退到序列协议 。
我认为用于评估"id" in item
的逻辑等同于:
## Implicit logic used to evaluate `"id" in item`
for i in itertools.count():
try:
result = item[i]
except IndexError:
return False
if result is "id" or result == "id":
return True
return False
在 Model.__getitem__
的计算中,引发了 KeyError。在基础层面上,如果 Model
是一个映射类型,我认为它应该实现 __contains__
以及 __getitem__
。 Python data model 是这样说的:
It is recommended that both mappings and sequences implement the __contains__()
method to allow efficient use of the in
operator; for mappings, in
should search the mapping’s keys
为了检查 TodoistAPI
class 中的键是否存在,我使用了 "in" 关键字。但是,它会导致 KeyError
.
我隔离了代码片段以检查导致 KeyError
的确切原因以及提供了哪些输入。
api = TodoistAPI(token)
api.sync()
print("id" in api.state["items"][0])
api.state["items"][0]
包含:
Item({'assigned_by_uid': None,
'checked': 0,
'child_order': 0,
'collapsed': 0,
'content': 'example task',
'date_added': '0',
'date_completed': None,
'day_order': 0,
'due': {'date': '0',
'is_recurring': True,
'lang': 'de',
'string': 'every day',
'timezone': None},
'has_more_notes': False,
'id': 0,
'in_history': 0,
'is_deleted': 0,
'labels': [0, 0],
'parent_id': None,
'priority': 1,
'project_id': 0,
'responsible_uid': None,
'section_id': None,
'sync_id': None,
'user_id': 0})
我期望print(...)
的输出是True
或False
,但实际输出如下
Traceback (most recent call last):
File "/Users/path/to/file.py", line 11, in
print("id" in applicationInterface.state["items"][0])
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/todoist/models.py", line 16, in __getitem__
return self.data[key]
KeyError: 0
Process finished with exit code 1
我还在 Todoist Github-Repository 中创建了一个问题:https://github.com/Doist/todoist-python/issues/64
最终,这是 Todoist
库中的错误。
首先,让我们想象这样一个额外的行:
item = api.state["items"][0]
print("id" in item)
这意味着当您编写 "id" in item
时,Python 会检查 class 中的 __contains__
方法。 Item
class 不 定义 __contains__
,但定义 __getitem__
(通过其基数 Model
)。
根据 Python 语言参考,__getitem__
will be called 评估 in
,使用 回退到序列协议 。
我认为用于评估"id" in item
的逻辑等同于:
## Implicit logic used to evaluate `"id" in item`
for i in itertools.count():
try:
result = item[i]
except IndexError:
return False
if result is "id" or result == "id":
return True
return False
在 Model.__getitem__
的计算中,引发了 KeyError。在基础层面上,如果 Model
是一个映射类型,我认为它应该实现 __contains__
以及 __getitem__
。 Python data model 是这样说的:
It is recommended that both mappings and sequences implement the
__contains__()
method to allow efficient use of thein
operator; for mappings,in
should search the mapping’s keys