我在正在循环的函数中遇到未绑定的本地错误。我在第一次迭代中没有得到错误,只有在第二次(很可能也是之后的一次)中得到错误。
我试过了:
似乎都不起作用
# 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)
答案 0 :(得分:2)
我怀疑您的代码有两个问题。它们共同构成了您所看到的异常,但即使您可以立即缓解异常,最终仍需要修复错误。
第一个错误有点推测性,但我怀疑 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}")
之类的异常清晰。< /p>
解决第二个问题最自然的方法可能是将 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
答案 1 :(得分:1)
我认为您正在搜索行 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, 2, 3, 4, 5]
print(func(a))
code 1
和 code 2
都会出现以下错误,因为我们在 n
语句之外访问 if
。
UnboundLocalError: local variable 'n' referenced before assignment