
本文讲解如何正确从aws sdk返回的嵌套列表-字典结构中提取特定字段(如windowid),避免因类型误用导致的“'list' object is not callable”错误,并提供健壮的访问方式与异常处理建议。
本文讲解如何正确从aws sdk返回的嵌套列表-字典结构中提取特定字段(如windowid),避免因类型误用导致的“'list' object is not callable”错误,并提供健壮的访问方式与异常处理建议。
在使用 AWS Systems Manager describe_maintenance_windows API 时,其返回值 response["WindowIdentities"] 是一个列表(list),即使只匹配到一个维护窗口,结果也始终是包含单个字典的列表,例如:
[
{
"WindowId": "mw-0154acefa2151234",
"Name": "test",
"Enabled": True,
"Duration": 4,
"Cutoff": 0,
"Schedule": "cron(0 0 11 ? * SUN#4 *)",
"NextExecutionTime": "2024-08-25T11:00Z"
}
]因此,直接调用 MWId("WindowId") 会触发 TypeError: 'list' object is not callable —— 因为 MWId 是列表,不支持函数式调用语法。
✅ 正确做法是先通过索引获取列表中的字典,再用键名访问字段:
MWId = response["WindowIdentities"] mwidvalue = MWId[0]["WindowId"] # 获取第一个窗口的 WindowId
⚠️ 但该写法存在风险:若未匹配到任何窗口(即 MWId 为空列表 []),MWId[0] 将抛出 IndexError。为提升代码健壮性,推荐采用以下安全访问方式:
✅ 推荐:带空值校验的提取逻辑
def lambda_handler(event, context):
response = client.describe_maintenance_windows(Filters=[
{"Key": "Name", "Values": ["test"]}
])
window_list = response.get("WindowIdentities", [])
if not window_list:
raise ValueError("No maintenance window found with name 'test'")
# 安全获取 WindowId(假设取第一个匹配项)
mwidvalue = window_list[0].get("WindowId")
if not mwidvalue:
raise KeyError("WindowId key missing in returned window identity")
return {"WindowId": mwidvalue}? 补充说明:
- 使用 .get(key, default) 可避免 KeyError;
- 显式检查列表长度或使用 next() + 生成器可支持更灵活的查找(如按 Name 精确匹配多结果);
- 生产环境建议添加 boto3 异常捕获(如 ClientError)以处理权限、资源不存在等场景。
掌握这种「列表 → 字典 → 键值」的层级访问模式,是解析绝大多数 AWS API 响应(如 EC2 describe_instances、Lambda list_functions 等)的关键基础。

















