如何通过Google Directory API合并多页返回的组成员列表?
问题:如何批量追加Google Directory API分页返回的群组成员?
我通过Google Directory API获取Google群组成员,API返回的结果结构如下:
{ 'etag': '"..."', 'kind': 'admin#directory#members', 'members': [ {'email': 'a@a.com', 'etag': '"..."', 'id': '....', 'kind': 'admin#directory#member', 'role': 'MEMBER', 'type': 'USER'}, {'email': 'b@a.com', 'etag': '"..."', 'id': '...', 'kind': 'admin#directory#member', 'role': 'MEMBER', 'type': 'USER'}, ... ], 'nextPageToken': '...' }
因为结果是分页的,我想把后续页面的成员追加到同一个字典的members列表里,但现有代码里的memberEmails.update(member_results)会覆盖已有键,没法实现需求,该怎么改?有哪些替代方案?
原代码:
for group in groups_list: members_service = service.members() member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER') memberEmails = {} while member_request is not None: member_results = member_request.execute() memberEmails.update(member_results) member_request = members_service.list_next(member_request, member_results)
方案一:单独维护成员列表,最后组装字典
直接用一个列表存储所有成员,把每一页的members都追加进去,最后再和元数据(如etag、kind)组装成目标字典:
for group in groups_list: members_service = service.members() member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER') # 初始化空列表存所有成员 all_members = [] # 临时存储第一页的元数据 member_meta = {} while member_request is not None: member_results = member_request.execute() # 第一次循环时保存元数据(etag、kind等) if not all_members: member_meta = {k: v for k, v in member_results.items() if k != 'members' and k != 'nextPageToken'} # 追加当前页的成员到总列表 if 'members' in member_results: all_members.extend(member_results['members']) member_request = members_service.list_next(member_request, member_results) # 组装最终的字典 memberEmails = member_meta.copy() memberEmails['members'] = all_members
方案二:直接操作目标字典的members列表
如果想直接维护目标字典,就检查字典中是否已有members键,没有则初始化,有则追加新成员:
for group in groups_list: members_service = service.members() member_request = members_service.list(groupKey=group['email'], maxResults=200, roles='MEMBER') memberEmails = {} while member_request is not None: member_results = member_request.execute() # 处理成员列表 if 'members' in member_results: if 'members' in memberEmails: # 已有成员列表,追加新成员 memberEmails['members'].extend(member_results['members']) else: # 首次加载,直接赋值 memberEmails['members'] = member_results['members'] # 处理元数据(仅保留第一页的etag、kind) if not memberEmails: memberEmails.update({k: v for k, v in member_results.items() if k != 'members' and k != 'nextPageToken'}) member_request = members_service.list_next(member_request, member_results)
补充说明
- 原代码的
update方法确实会覆盖字典中的重复键(比如每一页的etag、nextPageToken),这不符合追加成员的需求。 - 关于元数据:如果API每一页返回的
etag、kind值一致,取第一页的即可;如果有差异,可根据实际需求决定保留哪一页的内容。
内容的提问来源于stack exchange,提问作者bobz
相关产品推荐
相关产品推荐

