大佬教程收集整理的这篇文章主要介绍了UnboundLocalError:在赋值之前引用了局部变量 <var>,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在正在循环的函数中遇到未绑定的本地错误。我在第一次迭代中没有得到错误,只有在第二次(很可能也是之后的一次)中得到错误。
我试过了:
似乎都不起作用
# 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_key
和 secret_key
。假设只有一个tenant == "tenant"
,找到后可以直接返回accessKey
,secretKey
。
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
我在以下代码中重现了您的错误,这证明在条件语句(如 if
、elif
)中声明的变量在该条件语句的范围之外无法访问。
# 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 1
和 code 2
都会出现以下错误,因为我们在 n
语句之外访问 if
。
UnboundLocalError: local variable 'n' referenced before assignment
以上是大佬教程为你收集整理的UnboundLocalError:在赋值之前引用了局部变量 <var>全部内容,希望文章能够帮你解决UnboundLocalError:在赋值之前引用了局部变量 <var>所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。