【问题标题】:variable referenced before assignment error in python [duplicate]在python中的赋值错误之前引用的变量[重复]
【发布时间】:2019-09-14 23:23:16
【问题描述】:

在我的代码中,我正在测试用户是否拥有 AWS 访问密钥:

for response in paginator.paginate(UserName=user_name):
    if len(response['AccessKeyMetadata']) and 'AccessKeyId' in response['AccessKeyMetadata'][0].keys():
        key1 = response['AccessKeyMetadata'][0]['AccessKeyId']

稍后在我的代码中我会测试 key1 是否存在:

if key1:
    print("\nAccess Key 1: ", key1)
else:
    print("The user does not have any keys.")

如果用户根本没有键,则函数将失败并出现以下错误:

  File ".\aws_iam_utils.py", line 1430, in rotate_access_keys
    if key1:
UnboundLocalError: local variable 'key1' referenced before assignment

我是否在测试 key1 是否正确存在?为什么我得到一个未绑定的本地错误,而它应该只打印出 else 子句中的语句?

【问题讨论】:

  • minimal reproducible example。这是在不同的功能中吗?
  • 不,这个错误发生在一个函数中。
  • 对于if key:,您不会询问变量key1 是否存在。您假设变量存在并询问它是否具有 truthy 值。

标签: python


【解决方案1】:

您正在体验Nonenullundefined 之间的区别。考虑三个卫生纸架。一个有很多,一个是内部纸板管,一个甚至没有管。或者换一种说法,一个有int论文,一个有None论文,一个是nullundefined

如另一个答案中所述,在您的 if 语句之前将 key1 初始化为 None 以修复它。

key1 = None

检查变量是否存在:

if 'key1' in globals():
    print(key1) # Or whatever

【讨论】:

    【解决方案2】:

    您只需要在if 条件之前初始化key1,即

    key1 = None  # <- You need this line
    for response in paginator.paginate(UserName=user_name):
        if len(response['AccessKeyMetadata']) and 'AccessKeyId' in response['AccessKeyMetadata'][0].keys():
            key1 = response['AccessKeyMetadata'][0]['AccessKeyId']
    

    这是因为如果 if 条件不满足,key1 将不会在您的原始代码中创建。

    【讨论】:

    • 好的,谢谢。是否可以测试变量是否存在?我该怎么做?
    【解决方案3】:

    if key1: 不测试key1 是否存在;它测试它是否包含“真实”值,并假设它确实存在。

    【讨论】:

    • 好的,谢谢。如何测试变量是否存在?
    • 你最好不要。使其存在并将其设置为 None 之类的值。
    • @bluethundr 您使用此答案stackoverflow.com/a/843293/10553976 中的成语检查是否存在,我会将其添加到我的答案中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2017-11-11
    • 2020-04-10
    相关资源
    最近更新 更多