python脚本错误:赋值前引用的局部变量

python script error : Local variable referenced before assignment

提问人:docker_compose 提问时间:11/9/2022 最后编辑:matszwecjadocker_compose 更新时间:11/9/2022 访问量:489

问:

我们编写了一个 Python 测试脚本来自动执行一些任务,包括添加服务帐户和资源组。在执行时,我收到一条错误消息:

“UnboundLocalError:在赋值之前引用了局部变量 'sa_clientId'”

我读了一些 stackoverflow 线程,其中谈到了与全局变量相关的问题。但sa_clientId不是一个全局变量。所以我不明白我做错了什么。

任何帮助将不胜感激。 请在下面找到在执行时触发崩溃的函数。

def create_service_account(bearer_token, parent_rg_id, rg_id, rg_name, roles):
    
    global sa_db
    
    print('>> Creating service account for rg %s with rg_id %s' % (rg_name, rg_id))
    print(type(roles), len(roles))
    print(roles)
    print(parent_rg_id)

    url = "https://<snipped>/api/controlplane/" + parent_rg_id + "/serviceaccounts"

    payload = json.dumps({
      "name": "Client %s - %s" % (rg_name, str(roles)),
      "resourceGroups": [
        {
          "resourceGroupId": rg_id,
          "roles": roles
        }
      ]
    })
    headers = {
      'api-version': '1.1',
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + bearer_token
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)
    
    if response.text != '':
        sa_infos = json.loads(response.text)
        sa_clientSecret = sa_infos['secret']['value']
        sa_clientId = sa_infos['clientId']
        sa_id = sa_infos['id']
        sa_name = sa_infos['name']
        sa_rg = sa_infos['resourceGroups']

        sa_db[sa_clientId] = {
          'secret': sa_clientSecret,
          'id': sa_id,
          'name': sa_name,
          'resourceGroups': sa_rg
        }


    return sa_clientId
python 变量 调试 测试 异常

评论

1赞 matszwecja 11/9/2022
您根本没有定义是否满足条件,因此当您尝试返回它时它会失败。如果提供完整的堆栈跟踪,调试也会更容易。sa_clientIdresponse.text != ''
0赞 BokiX 11/9/2022
请发布最少的代码,以便我们更容易地检测问题。

答:

0赞 Tyler Bury 11/9/2022 #1

在上面的代码中,你只在它通过时分配“clientId” “if response.text != '':”,通过这样做并返回 “clientId”,除非它通过 if 语句,否则它将在赋值之前被引用。 尝试添加默认值 State。

DxO (英语:DxO)

def take_command():
    with sr.Microphone() as source:
        print('listening...')
        voice = listener.listen(source)
        try:
            command = listener.recognize_google(voice)
            if 'hey jarvis' in command:
                command = command.replace('hey jarvis', '')
                print(command)
        except:
            command = ''
    return command

如果它没有收到任何音频,则它会通过异常,但仍被分配值 ''。如果没有它,它还将返回“UnboundLocalError:在赋值之前引用的局部变量'sa_clientId'”