Как я могу проверить, что paginator python boto3 не дал результатов? - PullRequest
0 голосов
/ 16 февраля 2019

Это должен быть простой вопрос, но просто не могу найти ответ.

Я использую динамический разбивщик страниц:

paginator = dynamoDbClient.get_paginator('query')
response_iterator = paginator.paginate(...)

Я зацикливаюсь на результатах:

for response in response_iterator:

Я ожидал, что цикл не будет выполнен, если не было результатовнайденный.К сожалению, это так, и я не могу понять, что нужно проверить, чтобы указать, что ничего не найдено.

Пожалуйста, помогите.

Спасибо.

1 Ответ

0 голосов
/ 30 марта 2019

Обычно я пишу свою собственную логику разбиения на страницы, что-то вроде следующего:

while True:
    responseListPolicies = iam_client.list_policies(Marker=marker) if marker else iam_client.list_policies()
    truncatedListPolicies = responseListPolicies.get('IsTruncated')

    allPolicies = responseListPolicies.get('Policies')
    allPolicyArns += [policy.get('Arn') for policy in allPolicies]
    allPolicyNames += [policy.get('PolicyName') for policy in allPolicies]

    if not truncatedListPolicies:
        break
    marker = responseListPolicies.get('Marker')        
    print("Found truncated at marker " + marker)

Однако недавно я наткнулся на pagination, доступный через boto3, и решил поиграть с ним.Вот где я наткнулся на похожую проблему, пытаясь получить групповые политики.

Вот фрагмент того, что я пробовал:

paginator = iam_client.get_paginator('list_group_policies')
res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
listOfAllPolicyNames += res.build_full_result().get('PolicyNames')

И это выдало ошибку вроде:

Произошла ошибка (NoSuchEntity) при вызове операции ListGroupPolicies: Группа с именем groupName не найдена.

Я начал ее изучать.Я попытался понять, какие методы доступны для объекта res .Так что dir (res) дал что-то вроде этого (частичные результаты показаны ниже):

 ...
 'build_full_result',
 'non_aggregate_part',
 'result_key_iters',
 'result_keys',
 'resume_token',
 'search']

В итоге я посмотрел на result_keys , и это было что-то вроде этого:

[{'type': 'field', 'children': [], 'value': 'PolicyNames'}]

Я заметил, что элемент children был пустым списком.Поэтому я попробовал описанную выше нумерацию страниц с другим именем группы, которое, как я знал, наверняка будет иметь некоторые встроенные политики.И на этот раз также результаты были одинаковыми.В конце концов, я понял, что, возможно, не существует ключа, доступного напрямую, на который можно было бы обратить внимание.

Итак, наконец, пришлось прибегнуть к способу обработки исключений, как показано ниже:

try:
    paginator = iam_client.get_paginator('list_group_policies')
    res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
    res.build_full_result()
except Exception as e:
    if e.response['Error']['Code'] == 'NoSuchEntity':
        print("Entity does not exist")

Не знаю, насколько это поможет.Но это подход, который я выбрал.Ура!

...