Helper function for pagination using AWS boto3

I noticed that a lot of my boto3 code in s3-credentials looked like this:

paginator = iam.get_paginator("list_user_policies")
for response in paginator.paginate(UserName=username):
    for policy_name in response["PolicyNames"]:
        print(policy_name)

This was enough verbosity that I was hesitating on implementing pagination properly for some method calls.

I came up with this helper function to use instead:

def paginate(service, method, list_key, **kwargs):
    paginator = service.get_paginator(method)
    for response in paginator.paginate(**kwargs):
        yield from response[list_key]

Now the above becomes:

for policy_name in paginate(iam, "list_user_policies", "PolicyNames", UserName=username):
    print(policy_name)

Here's the issue and the refactoring commit.

Created 2022-01-19T11:49:58-08:00 · Edit