程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了UnboundLocalError:在赋值之前引用了局部变量 <var>大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决UnboundLocalError:在赋值之前引用了局部变量 <var>?

开发过程中遇到UnboundLocalError:在赋值之前引用了局部变量 <var>的问题如何解决?下面主要结合日常开发的经验,给出你关于UnboundLocalError:在赋值之前引用了局部变量 <var>的解决方法建议,希望对你解决UnboundLocalError:在赋值之前引用了局部变量 <var>有所启发或帮助;

我在正在循环的函数中遇到未绑定的本地错误。我在第一次迭代中没有得到错误,只有在第二次(很可能也是之后的一次)中得到错误。

我试过了:

  1. 将 accessKey 和 secretKey 初始化为全局变量,并将“global”关键字放入函数中。
  2. 在第一次迭代后清除/删除这些变量。

似乎都不起作用

# key_file[0] is a csv-file with columns: tenant,API_key,secret_key
def keys(tenant):
    for line in key_file[0]:
        if tenant == line.get('tenant'):
            accessKey = line.get('API_key')
            secretKey = line.get('secret_key')
    return  accessKey,secretKey

# tenant_List is a List with the names of the tenant

for tenant in tenant_List:
    keypair = keys(tenant) 
    print(keypair)

解决方法

我怀疑您的代码有两个问题。它们共同构成了您所看到的异常,但即使您可以立即缓解异常,最终仍需要修复错误。

第一个错误有点推测性,但我怀疑 key_file[0] 是一个迭代器(可能是一个 csv.DictReader 或类似的东西)。当您第一次调用 keys 时对其进行迭代,它按预期工作,迭代器中的项目根据需要使用。第二次调用 keys 时出现了问题,因为那时的迭代器已经耗尽,因此迭代它根本不会做任何事情。循环立即结束。

此问题的解决方法可能是将迭代器转储到一个序列中,您可以根据需要对其进行多次迭代。这可以通过在某处等效于 key_file[0] = list(key_file[0]) 来完成(您可以将 list 调用放入第一次分配该值的任何现有代码中,而不是先分配迭代器,然后稍后将其转换为列表)。另一种方法可能是将整个文件打开和 CSV 解析逻辑移到 keys(或 keys 可以调用的函数)中,以便您可以在需要时重新创建迭代器。

另一个问题是,每当您请求不在您的文件中的租户的 keys 时,您的函数都会引发一个奇怪的异常。现在,引发一些异常可能是正确的做法,但是您现在得到的 UnboundLocalError 异常远不如 ValueError(f"Unknown tenant {tenant}") 之类的异常清晰。

解决第二个问题最自然的方法可能是将 return 调用移动到循环内的 if 块中,以便在找到密钥后立即返回它们。然后,如果您在循环结束时没有发现任何内容,则可以引发适当的异常。如果您确实需要保留搜索整个文件并返回最后匹配行的键的逻辑,您可以将 fooKey 值初始化为某个标记值,例如 None,然后在之后检查它循环以查看它们是否已更改(引发它们尚未更改的异常)。

无论如何,这是我的一般修复:

key_file[0] = list(csv.DictReader(...))  # this is somewhere above,probably


def keys(tenant):
    for line in key_file[0]:
        if tenant == line.get('tenant'):
            accessKey = line.get('api_key')
            secretKey = line.get('secret_key')
            return accessKey,secretKey           # return immediately if a match is found

    raise ValueError(f"Unknown tenant: {tenant}")  # it's an error if you reach here
,

我认为您正在搜索行 where tenant == "tenant" 以及相应的 api_keysecret_key。假设只有一个tenant == "tenant",找到后可以直接返回accessKeysecretKey

def keys(tenant):
    for line in key_file[0]:
        if tenant == line.get('tenant'):
            accessKey = line.get('api_key')
            secretKey = line.get('secret_key')
            return accessKey,secretKey

我在以下代码中重现了您的错误,这证明在条件语句(如 ifelif)中声明的变量在该条件语句的范围之外无法访问。

# code 1
def func(a):
    for i in a:
        if i == '5':
            n = 5

    return n

a = [1,2,3,4,5]
print(func(a))
# code 2
def func(a):
    for i in a:
        if i == '5':
            n = 5

        return n

a = [1,5]
print(func(a))

code 1code 2 都会出现以下错误,因为我们在 n 语句之外访问 if

UnboundLocalError: local variable 'n' referenced before assignment

大佬总结

以上是大佬教程为你收集整理的UnboundLocalError:在赋值之前引用了局部变量 <var>全部内容,希望文章能够帮你解决UnboundLocalError:在赋值之前引用了局部变量 <var>所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: