From d060998481d3636338822aba6ff3530295b3d69e Mon Sep 17 00:00:00 2001 From: Jamison <64172228+jamison-rose@users.noreply.github.com> Date: Wed, 22 Apr 2020 16:08:36 -0700 Subject: [PATCH] Update action.py to use python 3 compatible iterator In python 3 dict.items() return an iterator instead of the complete list of items. This means that when `del kwargs[k]` will result in a `RuntimeError: dictionary changed size during iteration` error. --- actions/lib/action.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/actions/lib/action.py b/actions/lib/action.py index b6f23b9a..b6d4c29c 100755 --- a/actions/lib/action.py +++ b/actions/lib/action.py @@ -193,21 +193,16 @@ def do_method(self, module_path, cls, action, **kwargs): del kwargs['zone'] obj = self.get_r53zone(zone) elif module_path == 'boto3.s3.transfer': - for k, v in kwargs.items(): - if not v: - del kwargs[k] - continue - if k == 'filename': - kwargs['Filename'] = kwargs.pop(k) - elif k == 'bucket': - kwargs['Bucket'] = kwargs.pop(k) - elif k == 'key': - kwargs['Key'] = kwargs.pop(k) + kwargs = {k: v for k, v in kwargs.items() if v} + if 'filename' in kwargs: + kwargs['Filename'] = kwargs.pop('filename') + if 'bucket' in kwargs: + kwargs['Bucket'] = kwargs.pop('bucket') + if 'key' in kwargs: + kwargs['Key'] = kwargs.pop('key') obj = self.get_boto3_session('s3') elif 'boto3' in module_path: - for k, v in kwargs.items(): - if not v: - del kwargs[k] + kwargs = {k: v for k, v in kwargs.items() if v} obj = self.get_boto3_session(cls) else: del self.credentials['region']