未定义全局名称“key”

时间:2016-05-16 06:34:44

标签: python amazon-s3 boto

我有一个循环运行的python程序来计算存储桶中的密钥数量,它有一个或多个密钥时工作正常。 当它有0个对象时会抛出错误。

def CdmCount(Destbucket):
    global key
    totalcdms = 0
    for key in Destbucket.get_all_keys():
        totalcdms += 1
        print totalcdms
    assert isinstance (key,object )
    return (totalcdms, key)

我看到以下错误:

  File "check_fun.py", line 24, in CdmCount
  return (totalcdms, key)
NameError: global name 'key' is not defined

完整代码http://pastebin.com/QrAwL4Dq

更新:

我添加了一个上层boto函数来列出存在的键数,如果它是零退出。

    keys = list(Destbucket.list())
if not keys:
    print "List is empty"
    sys.exit(2)

这是一个好方法吗?

1 个答案:

答案 0 :(得分:0)

您的代码已到达assert语句,而值尚未分配给key,因此未定义。此处不使用全局变量也会触发错误(UnboundLocalError: local variable 'key' referenced before assignment)。

在这里使用全局变量似乎不合理,你应该考虑使用函数返回值。

此外,使用具有相同名称的多个变量也是不好的做法。在这种情况下,您定义global key,然后再次重新定义key作为循环中的迭代变量。这样的事情会更好:

global key
for k in keys:
    if some_condition == k:
        key = k
...