在字典中添加密钥之前,如何使用循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在字典中添加密钥之前,如何使用循环?相关的知识,希望对你有一定的参考价值。

我使用Django作为框架。我正在使用boto3在我的views函数中创建一个AWS账户。每个创建的aws帐户都有一个AccountId。在进一步细节之前,这是我的片段:

 org = boto3.client('organizations')
 acc = org.create_account(
         Email=email,
         AccountName=lab_name,
         IamUserAccessToBilling='ALLOW'
         )
 cid = acc['CreateAccountStatus']['Id']
 time.sleep(70)

 #GET ACCOUNT DETAILS
 status = org.describe_create_account_status(
      CreateAccountRequestId=cid
     )
 accid = status['CreateAccountStatus']['AccountId']

最初我正在创建帐户。就像我之前提到的那样,创建账户需要一些时间(大约1到1.5分钟)。然后我需要获取帐户详细信息,其中一个细节是AccountId。我尝试增加睡眠时间来解决这个问题,但这没有帮助。当我尝试在'accid'声明行中获取AccountId值时,我收到错误。我得到的错误是:

KeyError:AccountId不存在

这可能是因为帐户尚未创建,并且在该事件之前我的代码正在尝试获取AccountId值。我怎样才能获得AccountId值?我应该尝试将它放在循环中或使用try和except块来避免错误消息吗?请帮忙。提前致谢。

答案
 status = org.describe_create_account_status(CreateAccountRequestId=cid)

 while status.get('CreateAccountStatus',{}).get('AccountId',None) is None:
     # sleep here
     status = org.describe_create_account_status(CreateAccountRequestId=cid)

 accid = status['CreateAccountStatus']['AccountId']

这将使用.get(key, default)dictdict提供它(或空'CreateAccountStatus')和None'AccountId'None

关于dict.get()dict.get-API


正如JonClements所指出的那样,使用while True: ... break ...构造可能更加pythonic:

while True:
    status = org.describe_create_account_status(CreateAccountRequestId=cid)
    try:
        accid = status['CreateAccountStatus']['AccountId']
        break
    except KeyError:
        time.sleep(30)

这避免了status = ...线的重复,并使流动更加清晰。

使用try: ... except:更适合pythonic ask-forgiveness-not-permission方法。

另一答案

在你的acc['CreateAccountStatus']变量中,你应该有一个关键状态,告诉你创建完成的时间。

这是documentation,请参阅响应语法

以上是关于在字典中添加密钥之前,如何使用循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何管理在每个 git 版本中添加私有代码片段?

如何将重复键添加到字典中

在循环Python中更新字典[重复]

如何根据密钥是否已存在更新我的字典? [重复]

如何在vscode emmet密钥建议中添加空间?

Keycloak |如何添加自定义密钥泄露密码策略?